最近使用c#调用另外一个同事写的java webservice耽误了很多时间,网上资料不太完整,走了很多弯路,希望对大家有帮助。

基本思路是
1.拼装soap使用http post ,主要将验证身份信息放入header中,以下code供参考:8-15行内用户、密码,其他soap信息需要根据自己的service修改,

可以使用soapui获取到body以及xmlns信息


 1 public class InvokeServiceWithSoap
 2     {
 3         public static void InvokeService()
 4         {
 5             StringBuilder soap = new StringBuilder();
 6             soap.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
 7             soap.Append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:end=\"http://localhost/service/\">");
 8             soap.Append("<soapenv:Header>");
 9             soap.Append("<wsse:Security xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\">");
10             soap.Append("<wsse:UsernameToken>");
11             soap.Append("<wsse:Username>username</wsse:Username>");//用户名
12             soap.Append("<wsse:Password Type=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText\">password</wsse:Password>");//口令
13             soap.Append("</wsse:UsernameToken>");
14             soap.Append("</wsse:Security>");
15             soap.Append("</soapenv:Header>");
16             soap.Append("<soapenv:Body>");
17             soap.Append("<end:service1>");
18             soap.Append("<arg0></arg0>");
19             soap.Append("</end:service1>");
20             soap.Append(" </soapenv:Body>");
21             soap.Append(" </soapenv:Envelope>");
22 
23             string url = "http://localhost/end:service1";
24             var result = GetSOAPReSource(url, soap.ToString());
25 
26         }
27 
28         public static string GetSOAPReSource(string url, string datastr)
29         {
30             try
31             {
32                 //request
33                 Uri uri = new Uri(url);
34                 WebRequest webRequest = WebRequest.Create(uri);
35                 webRequest.ContentType = "text/xml; charset=utf-8";
36                 webRequest.Method = "POST";
37                 using (Stream requestStream = webRequest.GetRequestStream())
38                 {
39                     byte[] paramBytes = Encoding.UTF8.GetBytes(datastr.ToString());
40                     requestStream.Write(paramBytes, 0, paramBytes.Length);
41                 }
42                 //response
43                 WebResponse webResponse = webRequest.GetResponse();
44                 using (StreamReader myStreamReader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8))
45                 {
46                     string result = "";
47                     return result = myStreamReader.ReadToEnd();
48                 }
49 
50             }
51             catch (Exception ex)
52             {
53                 throw ex;
54             }
55 
56         }
57 
58     }

2.使用wsdl生成代理类,代理类重写HttpRequest ,将安全验证信息增加到request中,也没有测试通过


 1  protected override System.Net.WebRequest GetWebRequest(Uri uri)
 2         {
 3             System.Net.WebRequest request= base.GetWebRequest(uri);
 4             System.Net.NetworkCredential nc = new System.Net.NetworkCredential();
 5             nc.UserName = "ssotest";//java webservice 用户名  
 6             nc.Password = "ssotest";//java webservice 密码  
 7             request.Credentials = nc;
 8             
 9             return request;
10         }
下面说一个比较简单的方法:
直接使用.net中的服务引用,注意是服务引用(类似WCF引用)主要通过servicemodel来设置安全认证信息,framework3.0以上都支持,
引用后将 Config中 servicemodel 的 endpoint  节点 增加headers ,安全验证信息增加尽量来即可。
以下是完整的config:

 1 <system.serviceModel>
 2     <bindings>
 3       <basicHttpBinding>
 4         <binding name="Service1SoapBinding" maxReceivedMessageSize="99999999"/>
 5       </basicHttpBinding>
 6     </bindings>
 7     <client>
 8         <endpoint address="http://local:9090/ Service1"
 9           binding="basicHttpBinding" bindingConfiguration="onlineUserServiceSoapBinding"
10           contract="smpwcf.Service1" name="Service1ImplPort" >
11             <headers>
12                 <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
13                     <wsse:UsernameToken>
14                         <wsse:Username>username</wsse:Username>
15                         <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">password</wsse:Password>
16                     </wsse:UsernameToken>
17                 </wsse:Security>
18             </headers>
19         </endpoint>
20     </client> 21   </system.serviceModel>

另外附加一段php soap调用java wsse webservice代码 (已经测试通过)

<?php


//Soap Request
class WSSESoapClient extends SoapClient {                                                                                           
    protected $wsseUser;
    protected $wssePassword;     public function setWSSECredentials($user, $password) {
        $this->wsseUser = $user;
        $this->wssePassword = $password;
    }     public function __doRequest($request, $location, $action, $version)
           {
        try
        {
        if (!$this->wsseUser or !$this->wssePassword)
          {
                   return parent::__doRequest($request, $location, $action, $version);
              }         // get SOAP message into DOM
        $dom = new DOMDocument();
        $dom->loadXML($request);
        $xp = new DOMXPath($dom);
        $xp->registerNamespace('soapenv', 'http://schemas.xmlsoap.org/soap/envelope/');
    
        // search for SOAP header, create one if not found
        $header = $xp->query('/soapenv:Envelope/soapenv:Header')->item(0);
    if (!$header)
           {
            $header = $dom->createElementNS('http://schemas.xmlsoap.org/soap/envelope/', 'soapenv:Header');
            $envelope = $xp->query('/soapenv:Envelope')->item(0);
            $envelope->insertBefore($header, $xp->query('/soapenv:Envelope/soapenv:Body')->item(0));
        }     // add WSSE header 
    $security = $dom->createElementNS('http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd', 'wsse:Security');
        $usernameToken = $dom->createElementNS('http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd', 'wsse:UsernameToken');
        $username = $dom->createElementNS('http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd', 'wsse:Username', $this->wsseUser);
    $password = $dom->createElementNS('http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd', 'wsse:Password', $this->wssePassword);
    $password->setAttribute( "Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText" );
    $security->appendChild($usernameToken);
    $usernameToken->appendChild($username);
        $usernameToken->appendChild($password);
        $header->appendChild($security);         // perform SOAP call
    $request = $dom->saveXML();
//    echo $request;
        return parent::__doRequest($request, $location, $action, $version);
    }
      catch (Exception $e)
      {
           echo "<h2>Post Method Error!</h2>"; 
            echo $e->getMessage(); 
      }
    } } 
  //build soap
try{
    $clientsoap = new WSSESoapClient("http://localhost/service1?wsdl");
    $clientsoap->setWSSECredentials("username","password");
//    $clientsoap->soap_defencoding = 'utf-8';
//    $clientsoap->decode_utf8 = false;
    //soap xml
    $request="<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:end=\"http://localhost/service1/\">"."<soapenv:Body>"."<end:service1>"."<arg0>参数</arg0>"."</end:service1>"."</soapenv:Body>"."</soapenv:Envelope>";
    $location="http://172.16.2.31:9090/smp/ws/onlineuserservice";
    $action=null;
           $version=0;
    $result =$clientsoap->__doRequest($request,$location,$action,$version);
    echo $result;
}
catch (Exception $e) { 
            echo "<h2>Exception Error!</h2>"; 
            echo $e->getMessage(); 
        } 
?>

c#调用带有安全认证的java webservice的更多相关文章

  1. java servlet调用带有多个返回结果集的存储过程

    一.mysql存储过程 这里我先说下我这个功能实现的逻辑及途中遇到的一些问题.这个存储过程一共带两个输入参数,一共关联到两张表的查询,每个参数都对应查询表中的一个判断,所以一共返回了两个结果集(当然要 ...

  2. java Servlet+mysql 调用带有输入参数和返回值的存储过程(原创)

    这个数据访问的功能,我在.NET+Mysql .NET+Sqlserver  PHP+Mysql上都实现过,并且都发布在了我博客园里面,因为我觉得这个功能实在是太重要,会让你少写很多SQL语句不说,还 ...

  3. JAVA 调用Axis2 code generator 生成的webservice

    以下代码为调用 JAVA 调用Axis2 code generator 生成的webservice的代码. package test; import java.rmi.RemoteException; ...

  4. Java WebService接口生成和调用 图文详解>【转】【待调整】

    webservice简介: Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应用之间 ...

  5. Java WebService 开发简单实例

    Web Service 是一种新的web应用程序分支,他们是自包含.自描述.模块化的应用,可以发布.定位.通过web调用.Web Service可以执行从简单的请求到复杂商务处理的任何功能.一旦部署以 ...

  6. paip.myeclipse7 java webservice 最佳实践o228

    paip.myeclipse7  java webservice 最佳实践o228 java的ws实现方案:jax-ws>>xfire ws的测试工具  webservice测试调用工具W ...

  7. MAXIMO系统 java webservice 中PDA移动应用系统开发

    MAXIMO系统 java webservice 中PDA移动应用系统开发  平时经常用的wince PDA手持设备调用c#写的webservice, 当然PDA也可以调用java webservic ...

  8. java webservice的多种实现方法汇总

    一.基于EJB容器管理webservice :     1.首先建立一个Web services EndPoint: package cn.test.service.impl; import java ...

  9. [Java] webservice soap,wsdl 例子

    java 调用webservice的各种方法总结 现在webservice加xml技术已经逐渐成熟,但要真正要用起来还需时日!! 由于毕业设计缘故,我看了很多关于webservice方面的知识,今天和 ...

随机推荐

  1. 鸟哥私房菜笔记:Iptables:数据包过滤软件

    数据包进入流程:规则顺序的重要性 iptables利用的是数据包过滤机制,所以它会分析数据包的包头数据.根据包头数据与定义的规则来决定该数据包是否可以进入主机或者是被丢弃.也就是说,根据数据包的分析资 ...

  2. php学习日志(1)-php介绍

    在学习Php之前,我们要搞懂php是什么.英文全称php: php hypertext preprocessor,即php超文本预处理器.php脚本在服务器上执行,故它是一种服务器编程语言. php文 ...

  3. json 包含字段及函数的写法

    在javascript中写类有多种方式: 1.function()中嵌套function; 2.prototype的方式 ,3.json的方式,如下: <script language=&quo ...

  4. python3 中自带urllib库可下载图片到本地

    刚从python3下载图片的语句python2的不太一样,具体python3语句如下: form urllib import request jpg_link = '......'  #图片链接 re ...

  5. django 的请求处理部分----WSGIHandler 源码分析 django1.5.5

    从这里拉开django框架的帷幕..撕开,哈哈 主要涉及的类:django.core.handlers.base.BaseHandler,django.core.handlers.wsgi.WSGIH ...

  6. R语言和大数据

    #安装R语言R3.3版本会出现各种so不存在的问题,退回去到R3.1版本时候就顺利安装.在安装R环境之前,先安装好中文(如果没有的话图表中显示汉字成框框了)和tcl/tk包(少了这个没法安装sqldf ...

  7. hdu 1251 统计难题 trie入门

    统计难题 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本 ...

  8. GPU CUDA常量内存使用

    #include <cuda.h> #include <stdio.h> int getMulprocessorCount(){ cudaDeviceProp prop; cu ...

  9. C#中的lock关键字(初识)

    http://kb.cnblogs.com/page/88513/ 首先给出MSDN的定义: lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.这是通过在代码块运行期间为给定对象获取互 ...

  10. CQRS学习——IOC,配置,仓储隔离以及QueryEntry[其三]

    从IoC开始说起 博主最早开始用的IoC容器叫AutoFac,那时候用它主要是为了生命周期管理——将EF上下文的生命周期限定为每请求.当然也总是每每听到IoC的好处,但是仍然不能理解其优势.最近在学习 ...