c#调用带有安全认证的java webservice

 最近使用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= " Service1 SoapBinding " 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= " Service1 ImplPort " >
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(); 
        } 
?>

 

 

http://php.net/manual/en/soapclient.soapclient.php 

 

 

转载于:https://www.cnblogs.com/flat_peach/archive/2012/11/01/donet_java_webservice.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值