![](/img/trans.png)
[英]C# code to add soap header wsse:Security, wsse:BinarySecurityToken,ds:Signature, wsse:UsernameToken,wsu:Timestamp
[英]Use wsse security header in soap message (Visual Studio 2015, .Net Framework 4.5)
我想使用DHL提供的肥皂服務。 你可以在這里找到wsdl: https : //wsbexpress.dhl.com/sndpt/expressRateBook?WSDL
因此,我在Visual Studio 2015中創建了一個新的ClassLibrary,目標是.net framework 4.5。
然后,我通過提供wsdl地址為創建的項目添加了Web引用。 我生成了一個包含所有類型和端口的代理文件,但我的第一個問題是,生成的Service擴展自System.Web.Services.Protocols.SoapHttpClientProtocol
。 正如我在最近的帖子中讀到的那樣,不可能將wsse標頭帶到該代理。 一些帖子建議添加wse但似乎wse不受新版Visual Studio版本的支持。
我嘗試通過svcutil生成我的代理。 之后,我將生成的.cs文件添加到項目中,並將生成的配置文件的內容復制到app.config。 (因為我刪除了Web引用)現在Service類擴展了System.ServiceModel.ClientBase
。 (我認為VS中的生成器在內部使用svctool。如果microsoft希望人們使用wcf,為什么生成器會生成非wcf代理文件。
我還創建了一個nunit testproject,它應該測試我的服務,但是如果我使用帶有svcutil生成版本的版本,我會收到一個錯誤。 因為錯誤以德語顯示,我嘗試將其翻譯為英語:
找不到指向服務合同的默認端點元素。 我發現這是因為代理在它自己的類庫中,因此沒有真正的app.config。 但我的測試項目也是一個類庫。
這些天消費需要ws安全用戶名/密碼的Web服務的實際方法是什么?
您可以在兼容模式下添加Web引用(我猜您正在這樣做)。 如果未在兼容模式下添加引用,請執行以下操作:
右鍵單擊引用添加服務引用 - >高級 - >添加Web引用(在兼容性部分下面),鍵入WS的URL並添加引用。
WSE2.0擴展可在以下位置以Nuget包的形式提供:
https://www.nuget.org/packages/Microsoft.Web.Services2/
在運行以下nugget命令的程序包管理器控制台上安裝nuget程序包:Install-Package Microsoft.Web.Services2
安裝nuget包后,您需要確保您的項目引用以下DLL:
為了使用WSE2.0擴展,您需要實際修改在添加WebReference時從“Microsoft.Web.Services2.WebServicesClientProtocol”而不是“System.Web.Services.Protocols.SoapHttpClientProtocol”繼承時創建的Proxy類。 ”。 請注意,如果更新WebReference,Proxy類將再次從SoapHttpClientProtocol繼承。
將以下using子句添加到使用Proxy類的代碼中:
using Microsoft.Web.Services2;
using Microsoft.Web.Services2.Security;
using Microsoft.Web.Services2.Security.Tokens;
進行此更改后,您的代碼應如下所示:
var token = new UsernameToken("theUser", "thePassword", PasswordOption.SendHashed);
var serviceProxy = new ExpressRateBook.gblExpressRateBook();
SoapContext requestContext = serviceProxy.RequestSoapContext;
requestContext.Security.Timestamp.TtlInSeconds = 60;
requestContext.Security.Tokens.Add(token);
//The rest of the logic goes here...
我在下面添加了屏幕截圖供您參考:
注意:我無法測試代碼,因為我不熟悉您需要使用的實際方法,顯示的代碼只是我在代理類中看到的示例,根據您的需要進行更新。 如果您按照之前描述的步驟操作它應該可以正常工作。 請查看以下鏈接以獲取更多詳細說明:
您可以配置服務引用以添加安全標頭,如AW Rowse在http://cxdeveloper.com/article/implementing-ws-security-digest-password-nonce-net-40-wcf中所述 :
private void Configure()
{
System.Net.ServicePointManager.ServerCertificateValidationCallback = (senderX, certificate, chain, sslPolicyErrors) => { return true; };
defaultBinding = new BasicHttpBinding
{
Security =
{
Mode = BasicHttpSecurityMode.Transport,
Transport =
{
ClientCredentialType = HttpClientCredentialType.Digest
}
}
};
defaultToken = new UsernameToken(UserName, Password, PasswordOption.SendHashed);
defaultSecurityHeader = MessageHeader.CreateHeader(
"Security",
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
defaultToken.GetXml(new XmlDocument())
);
}
並創建這樣的客戶端/代理:
public consulta_informacao_respttClient CriaConsultaClinicaClient()
{
var client = new consulta_informacao_respttClient(defaultBinding, new EndpointAddress("https://resqa.homologacao.unimed.coop.br/chs-integration-external-services-ptu-clinical/proxy-services/execute-query/execute-query-proxy-service"));
client.ClientCredentials.UserName.UserName = UserName;
client.ClientCredentials.UserName.Password = Password;
var scope = new OperationContextScope(client.InnerChannel);
OperationContext.Current.OutgoingMessageHeaders.Add(defaultSecurityHeader);
return client;
}
您需要在班級中創建的屬性是:
private BasicHttpBinding defaultBinding;
private UsernameToken defaultToken;
private MessageHeader defaultSecurityHeader;
您無需在app / web.config中配置任何內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.