c#调用带有安全认证的javawebservice

 最近使用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中,也没有测试通过

 

下面说一个比较简单的方法:
直接使用.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(); 
        } 
?>

 

 

 

 

原文链接:https://www.cnblogs.com/flat_peach/archive/2012/11/01/donet_java_webservice.html

原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/17552

(0)
上一篇 2023年2月4日
下一篇 2023年2月5日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

优速盾注册领取大礼包www.cdnb.net
/sitemap.xml