• 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="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(); 
            } 
    ?>
    复制代码
  • 相关阅读:
    To do list
    2020 上半学期比赛记录
    板子
    Project Euler 1~10 野蛮题解
    卡常火车头
    防止unordered_map 被卡方法
    2019 香港区域赛 BDEG 题解
    2019徐州区域赛 ACEFM 题解 & pollard-rho & miller-rabin & 求出每个子树的重心 板子
    BST-splay板子
    ZJOI2017(2) 游记
  • 原文地址:https://www.cnblogs.com/Alex80/p/4273878.html
Copyright © 2020-2023  润新知