[英]How to consume SOAP service with custom header
我需要从供应商处使用SOAP服务。 我在visual studio中使用WSDL创建了一个代理服务,实例化了客户端类,称为操作方法,并得到了响应。 一切正常,直到供应商在soap信封标题中要求访问令牌。 我可以在另一个服务调用中从它们获取访问令牌,但是如何将其添加到soap请求标头中?
以下是供应商标题的结构:
<SOAP:Header>
<SOAP-SEC:Security SOAP:mustUnderstand="1">
<wsse:SecuredKey ValueType="..." EncodingType="wsse:Base64Binary">
{ACCESS TOKEN}
</wsse:SecuredKey>
</SOAP-Sec:Security>
</SOAP:Header>
<SOAP:Body/>
</SOAP:Envelop>
到目前为止,最简单的方法是在模板中使用字符串替换。 将消息存储为项目中的资源(例如,在Resources.resx中或另存为文件并将set build action设置为嵌入式资源)。 模板看起来像这样:
<SOAP:Header>
<SOAP-SEC:Security SOAP:mustUnderstand="1">
<wsse:SecuredKey ValueType="..." EncodingType="wsse:Base64Binary">
{ACCESS TOKEN}
</wsse:SecuredKey>
</SOAP-Sec:Security>
</SOAP:Header>
<SOAP:Body/>
</SOAP:Envelop>
从模板中将模板作为字符串加载,然后调用Web服务以获取访问令牌,并使用实际访问令牌替换{ACCESS TOKEN} 。 您现在可以使用例如System.Net.Http.HttpClient
或System.Net.WebClient
发送soap消息。
使用WebClient
示例
using (var client = new WebClient())
{
var result = client.UploadString("http://your.target/endpoint", yourXDocument.ToString(SaveOptions.DisableFormatting));
return XDocument.Parse(result);
}
SaveOptions.DisableFormatting
不会尝试打印XDocument
,这在使用带有WS-Security的签名xml文档时非常重要。 不确定是否适用于您的情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.