.Net調用Java端帶有WS-Security支援的Web Service【親測通過】

來源:互聯網
上載者:User

標籤:port   拷貝   less   sdn   rgs   void   手動   部落格   rri   

做了幾年的開發,今天終於鼓起勇氣開通了部落格園。平時都是找各種大牛,看他們的分享部落格的解決BUG。從今天起,我也開始分享我學習之路。還望大家多多支援!       

 

最近收到一個採用Axis2實現的WebService通過.net對接的需求,開始已為挺簡單的一個事,常規引用調用後,測試不通過,需要驗證密碼。之後。。。開始瘋狂的尋碼之旅。

方案一:https://www.cnblogs.com/yf2011/p/5465558.html  

 本方案讓我試的好苦,WSE 2.0、WSE 3.0 都是vs老版本的(本人用VS 2017 ),我嘗試了一下WSE 3.0,沒有成功。大家可以試試,VS2017 NuGET包裡還有WSE 3.0,應該是可以的。

本人方案:

                參考地址1:46909395

                參考地址2: https://stackoverflow.com/questions/734355/clueless-about-how-to-create-soap-wssesecurity-header

        參考地址3:40340819

首先本人採用的是WCF配置方案。 參考地址1 解決了WSDL地址如何通過WCF工具 產生用戶端可調用的.cs檔案。

 操作步驟:

  1. 開啟VS 2017的開發人員命令提示字元工具
  2. 輸入svcutil.exe http://localhost:6054/ServiceDemo.svc?wsdl ,直接斷行符號會產生兩個檔案.cs、.config。
  3. .cs檔案直接拷貝到項目中,.config改成你項目的app.config替換。開啟app.config檔案
    <?xml version="1.0" encoding="utf-8"?><configuration>    <system.serviceModel>        <bindings>            <basicHttpBinding>                <binding name="data1Binding" />            </basicHttpBinding>            <customBinding>                <binding name="data2Binding">                    <textMessageEncoding messageVersion="Soap12" />                    <httpTransport />                </binding>            </customBinding>        </bindings>        <client>            <endpoint address="http://XXX1.com/"                binding="basicHttpBinding" bindingConfiguration="data1Binding"                contract="dataServicePortType" name="dataServiceHttpSoap11Endpoint" />            <endpoint address="http://XXX2.com/"                binding="customBinding" bindingConfiguration="data2Binding"                contract="dataServicePortType" name="dataServiceHttpSoap12Endpoint" />        </client>    </system.serviceModel></configuration>

    采坑一:有點可能和我一樣有兩個地址。那對不起只能用一個,刪除一個即可。
    采坑二:如果你的WCF做為一個單項目,要將.config檔案內容添加到主專案的.config檔案中。

  4. 添加一個SecurityHeader類,代碼如下:
    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Code{    public class SecurityHeader : System.ServiceModel.Channels.MessageHeader    {        public string userName;        public string password;        public SecurityHeader(string name,string psw) {            userName = name;            password = psw;        }        protected override void OnWriteStartHeader(System.Xml.XmlDictionaryWriter writer, System.ServiceModel.Channels.MessageVersion messageVersion)        {            writer.WriteStartElement("wsse", Name, Namespace);            writer.WriteXmlnsAttribute("wsse", Namespace);        }        protected override void OnWriteHeaderContents(System.Xml.XmlDictionaryWriter writer, System.ServiceModel.Channels.MessageVersion messageVersion)        {            writer.WriteStartElement("wsse", "UsernameToken", Namespace);            writer.WriteStartElement("wsse", "Username", Namespace);            writer.WriteValue(userName);            writer.WriteEndElement();            writer.WriteStartElement("wsse", "Password", Namespace);            writer.WriteAttributeString("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");            writer.WriteValue(password);            writer.WriteEndElement();            writer.WriteEndElement();        }        public override string Name        {            get { return "Security"; }        }        public override string Namespace        {            get { return "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; }        }    }}

    此類主要作用是手動建立了SOAP協議要求標頭,參考地址2 為原創。參考地址3 是我找到的JAVA版代碼,應該能很好的解釋為什麼要這麼寫。

  5. 調用方法,代碼如下:
    public static void Main(string[] args)    {        var webService = new ServiceReference1.MyWebService();//你的webservice            webService.Open();        using (OperationContextScope scope = new OperationContextScope((IContextChannel)webService.InnerChannel))        {            MessageHeaders messageHeadersElement = OperationContext.Current.OutgoingMessageHeaders;            messageHeadersElement.Add(new SecurityHeader("UserName", "Password"))             var res = webService.MyServe("方法參數");//webservice 裡的方法            Console.WriteLine(res.ToString());        }    }

 這樣就可以產生測試了,是不是感覺很簡單。可我就是為此事做了三天。第一次寫,寫的不好的地方,大家請諒解!

.Net調用Java端帶有WS-Security支援的Web Service【親測通過】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.