標籤: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檔案。
操作步驟:
- 開啟VS 2017的開發人員命令提示字元工具
- 輸入svcutil.exe http://localhost:6054/ServiceDemo.svc?wsdl ,直接斷行符號會產生兩個檔案.cs、.config。
- .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檔案中。
- 添加一個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版代碼,應該能很好的解釋為什麼要這麼寫。
- 調用方法,代碼如下:
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【親測通過】