【问题标题】:How to consume SOAP service with custom header如何使用自定义标头使用 SOAP 服务
【发布时间】:2019-04-05 01:22:45
【问题描述】:

我需要使用供应商提供的 SOAP 服务。我在 Visual Studio 中使用 WSDL 创建了一个代理服务,实例化了客户端类,调用了 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>

【问题讨论】:

    标签: c# web-services soap


    【解决方案1】:

    到目前为止,最简单的方法是在模板中使用字符串替换。将消息作为资源存储在您的项目中(例如,在 Resources.resx 中或另存为文件并将设置构建操作设置为嵌入资源)。模板如下所示:

    <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.HttpClientSystem.Net.WebClient

    使用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 文档时可能很重要。不确定这是否适用于您的情况。

    【讨论】:

    • 你能举个例子吗?最近几天我在网上查看,发现所有内容都是使用soap xml 创建 XmlDocument 并使用 HttpWebRequest 发出实际请求。我找不到一个使用 HttpClient 的示例。
    • 我只使用HttpClient 作为一种可能性。您也可以使用HttpWebRequestWebClient。我已经用一个例子更新了我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 2015-02-07
    • 2016-12-10
    • 2011-01-04
    • 1970-01-01
    相关资源
    最近更新 更多