如何处理来自 Web Service 客户端的未知 SOAP 标头

处理来自 Web 服务客户端的未知 SOAP 标头

  1. 向实现 Web 服务的类添加类型为 SoapUnknownHeaderSoapHeader 或二者的数组的成员变量,以处理多个未知的 SOAP 标头。

    将该类型声明为 SoapUnknownHeader 的数组或单个实例,还可以使 SoapUnknownHeader 具有 Element 属性,从而获得额外的好处。 Element 属性属于 XmlElement 类型,它表示 SOAP 请求或 SOAP 响应的 Header 元素的 XML 文档。 因此,通过询问Element 属性,Web 服务方法就可以确定 SOAP 标头的名称以及 SOAP 标头传递的数据。

     
    public class MyWebService {
        public SoapUnknownHeader[] unknownHeaders;
    
    
     
    Public Class MyWebService
        Public unknownHeaders() As SoapUnknownHeader
    
  2. 向要处理每个未知 SOAP 标头的每个 Web 服务方法应用 SoapHeader 属性。

     
        
        [WebMethod]
        [SoapHeader("unknownHeaders")]
        public string MyWebMethod()
    
    
     
        <WebMethod, _
         SoapHeader("unknownHeaders") > _
        Public Function MyWebMethod() As String
     
    
  3. 添加代码以确定是否能够处理所有未知的 SOAP 标头。

    如果成员变量属于 SoapUnknownHeader 类型,则通过询问 Element 属性,Web 服务方法可以确定 SOAP 标头的名称以及 SOAP 标头传递的数据。 Element 属性的 Name 属性标识 SOAP 标头的名称。

     
           
           foreach (SoapUnknownHeader header in unknownHeaders) 
           {
             // Check to see if this a known header.
             if (header.Element.Name == "MyKnownHeader")
    
    
     
           Dim header As SoapUnknownHeader       
           For Each header In unknownHeaders
             ' Check to see if this is a known header.
             If (header.Element.Name = "MyKnownHeader") Then
    
  4. 对于表示未知 SOAP 标头的成员变量,如果它知道如何处理特定的 SOAP 标头,请将其 DidUnderstand 属性设置为 true

    如果 Web 服务方法确实处理未知的 SOAP 标头但未将 DidUnderstand 属性设置为 true,则会引发 SoapHeaderException。 有关更多详细信息,请参见处理 XML Web services 客户端所要求的 SOAP 标头

     
             // Check to see if this is a known header.
             if (header.Element.Name == "MyKnownHeader")
                   header.DidUnderstand = true;
             else
                 // For those headers that cannot be 
                 // processed, set DidUnderstand to false.
                 header.DidUnderstand = false;
             }
    
    
     
             ' Check to see if this a known header.
             If (header.Element.Name = "MyKnownHeader") Then
                   header.DidUnderstand = True
             Else
                 ' For those headers that cannot be 
                 ' processed, set DidUnderstand to false.
                 header.DidUnderstand = False
             End If
    
    Note注意:

    用 ASP.NET 创建的 Web 服务使用 DidUnderstand 属性与 Web 服务方法进行通信。 SOAP 规范中并没有此规定。 该属性的值不会出现在 SOAP 请求或 SOAP 响应的任何部分中。

    Note注意:

    当 Web 服务客户端使用 Web 服务描述语言工具 (Wsdl.exe) 生成代理类,而 Web 服务使用 SoapUnknownHeader 类型定义表示 SOAP 标头的成员变量时,将不会向代理类中添加对该 SOAP 标头的任何引用。 如果 Web 服务客户端决定将该 SOAP 标头添加到 SOAP 请求中,它们必须向调用适用的 Web 服务方法的方法添加成员变量并应用 SoapHeader 属性,从而来修改代理类。

原文地址:https://www.cnblogs.com/yangzhx/p/3602003.html