共用方式為


HOW TO:處理未知的 SOAP 標頭

本主題專門說明舊有技術。 應該使用下列建立 XML Web Service 及 XML Web Service 用戶端: Windows Communication Foundation.

Web 服務用戶端將 SOAP 要求傳送至 Web 服務方法時,可能會使用 Web 服務預期但未明確定義的 SOAP 標頭。在這種情況下,務必判斷 SOAP 標頭的語意是否能解讀和處理,因為 SOAP 規格表示,當 SOAP 標頭的 mustUnderstand 屬性設定為 true 時,會擲回例外處理。如需處理用戶端所需 SOAP 標頭的詳細資訊,請參閱處理 XML Web Service 用戶端所需的 SOAP 標頭

若要處理來自 Web 服務用戶端的未知 SOAP 標頭

  1. 在實作 Web 服務的類別中,使用 SoapUnknownHeaderSoapHeader 的型別 (或任一個的陣列) 來加入成員變數,以處理多個未知的 SOAP 標頭。

    將型別宣告為 SoapUnknownHeader 的陣列或單一執行個體,還有一個附加好處:SoapUnknownHeaderElement 屬性。Element 屬性的型別為 XmlElement,表示 SOAP 要求或 SOAP 回應之 Header 項目的 XML 文件。因此,Web 服務方法可以藉由質詢 Element 屬性,來判斷 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,則 Web 服務方法可以藉由質詢 Element 屬性,來判斷 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 Service 用戶端所需的 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
    
    hf2y839a.note(zh-tw,VS.100).gif注意:
    使用 ASP.NET 建立的 Web 服務會使用 DidUnderstand 屬性,與 Web 服務方法通訊。這個屬性不是 SOAP 規格的一部分。它的值不會出現在 SOAP 要求或 SOAP 回應的任何部分。

    hf2y839a.note(zh-tw,VS.100).gif注意:
    當 Web 服務用戶端使用 Web 服務描述語言工具 (Wsdl.exe) 來建立 Proxy 類別,而 Web 服務使用 SoapUnknownHeader 型別來定義表示 SOAP 標頭的成員變數時,該 SOAP 標頭的參考不會加入至此 Proxy 類別。如果 Web 服務用戶端決定要將該 SOAP 標頭加入至 SOAP 要求,則必須修改 Proxy 類別,方法是加入成員變數,並將 SoapHeader 屬性套用至呼叫適當 Web 服務方法的方法。

另請參閱

參考

SoapHeader
SoapHeaderAttribute
SoapUnknownHeader
SoapHeaderException

概念

建置 XML Web Service 用戶端

其他資源

使用 SOAP 標頭
使用 ASP.NET 的 XML Web Service