Sdílet prostřednictvím


Gewusst wie: Behandeln von SOAP-Headern, die für einen XML-Webdienstclient benötigt werden

Codebeispiel

Ein Client kann erfordern, dass eine Webdienstmethode die Semantik des SOAP-Headers richtig interpretiert und diesen entsprechend verarbeitet, damit die SOAP-Anforderung erfolgreich beantwortet werden kann. Hierzu legen Clients das mustUnderstand-Attribut des SOAP-Headers auf 1 fest. Die folgende SOAP-Anforderung erfordert beispielsweise, dass der Empfänger der SOAP-Anforderung den Soap-Header MyCustomSoapHeader verarbeitet.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/" >
  <soap:Header>
    <MyCustomSoapHeader soap:mustUnderstand="1" xmlns="https://www.contoso.com">
      <custom>Keith</custom>
    </MyCustomSoapHeader>
  </soap:Header>
  <soap:Body>
    <MyUnknownHeaders xmlns="https://www.contoso.com" />
  </soap:Body>
</soap:Envelope>

Wie der Webdienst einen vom Client benötigten SOAP-Header behandelt, hängt davon ab, ob der SOAP-Header vom Webdienst definiert wird oder nicht. ASP.NET übernimmt einen Großteil der Aufgaben, wenn der Webdienst den SOAP-Header definiert. Im nachfolgenden Abschnitt erfahren Sie, wie die beiden Fälle behandelt werden.

So behandeln Sie SOAP-Header, die vom Webdienst nicht definiert, aber von einem Webdienstclient benötigt werden

  • Folgen Sie den Schritten zur Behandlung unbekannter SOAP-Header von einem Webdienstclient, und beachten Sie besonders die DidUnderstand-Eigenschaft des SOAP-Headers.

    Bei SOAP-Headern, die nicht durch den XML-Webdienst definiert wurden, ist der Anfangswert von DidUnderstand auf false festgelegt. Wenn ASP.NET nach der Rückgabe der Webdienstmethode SOAP-Header erkennt, deren DidUnderstand-Eigenschaft auf false festgelegt ist, wird automatisch eine Ausnahme des Typs SoapHeaderException ausgelöst.

So behandeln Sie SOAP-Header, die von einem Webdienstclient benötigt und vom Webdienst definiert werden

  • Führen Sie innerhalb jeder Webdienstmethode die Schritte für die Verarbeitung von SOAP-Headern in einem mit ASP.NET erstellten Webdienst aus.

    Bei SOAP-Headern, die vom Webdienst definiert und in der Webdienstmethode, die den SOAP-Header empfängt, verarbeitet werden, setzt ASP.NET voraus, dass der Webdienst den SOAP-Header versteht, und legt den Anfangswert von DidUnderstand auf true fest.

Beispiel

Der folgende Webdienst MyWebService definiert den SOAP-Header MyHeader und erfordert, dass dieser bei jedem Aufruf der XML-Webdienstmethode MyWebMethod gesendet wird. Darüber hinaus verarbeitet MyWebMethod alle unbekannten SOAP-Header. Bei SOAP-Headern, die von MyWebMethod verarbeitet werden können, wird DidUnderstand auf true festgelegt.

<%@ WebService Language="C#" Class="MyWebService" %>
using System.Web.Services;
using System.Web.Services.Protocols;

// Define a SOAP header by deriving from the SoapHeader base class.
public class MyHeader : SoapHeader {
    public string MyValue;
}
public class MyWebService {
    public MyHeader myHeader;

    // Receive all SOAP headers other than the MyHeader SOAP header.
    public SoapUnknownHeader[] unknownHeaders;
 
    [WebMethod]
    [SoapHeader("myHeader")]
    //Receive any SOAP headers other than MyHeader.
    [SoapHeader("unknownHeaders")]
    public string MyWebMethod() 
    {
       foreach (SoapUnknownHeader header in unknownHeaders) 
       {
         // Perform some processing on the header.
         if (header.Element.Name == "MyKnownHeader")
               header.DidUnderstand = true;
         else
                // For those headers that cannot be 
                // processed, set DidUnderstand to false.
                header.DidUnderstand = false;
       }
       return "Hello";
    }
}
<%@ WebService Language="VB" Class="MyWebService" %>
Imports System.Web.Services
Imports System.Web.Services.Protocols

' Define a SOAP header by deriving from the SoapHeader base class.
Public Class MyHeader : Inherits SoapHeader
    Public MyValue As String
End Class

Public Class MyWebService
    Public myHeader As MyHeader
    
    ' Receive all SOAP headers other than the MyHeader SOAP header.
    Public unknownHeaders() As SoapUnknownHeader    
    
    <WebMethod, _
     SoapHeader("myHeader"), _
     SoapHeader("unknownHeaders")> _
    Public Function MyWebMethod() As String
        'Receive any SOAP headers other than MyHeader.
        Dim header As SoapUnknownHeader        For Each header In unknownHeaders
            ' Perform some processing on the header.
            If header.Element.Name = "MyKnownHeader" Then
                header.DidUnderstand = True
            ' For those headers that cannot be 
            ' processed, set DidUnderstand to false.
            Else
                header.DidUnderstand = False
            End If
        Next header
        Return "Hello"
    End Function
End Class
NoteHinweis:

Die DidUnderstand-Eigenschaft wird von ASP.NET zur Kommunikation mit der Webdienstmethode verwendet. Diese Eigenschaft ist in der SOAP-Spezifikation nicht enthalten, ihr Wert kommt weder in der SOAP-Anforderung noch in der SOAP-Antwort vor.

NoteHinweis:

Wenn ein Webdienst einen SOAP-Header weiterleitet, müssen die Richtlinien in der SOAP-Spezifikation unbedingt beachtet werden, insbesondere jene, die den Wert von Actor betreffen. Weitere Informationen finden Sie auf der W3C-Website unter http://www.w3.org/TR/soap (nur auf Englisch verfügbar).

Siehe auch

Referenz

SoapHeader
SoapHeaderAttribute
SoapUnknownHeader
SoapHeaderException

Konzepte

Erstellen von XML-Webdienstclients

Weitere Ressourcen

Verwenden von SOAP-Headern
XML-Webdienste, die ASP.NET verwenden

Footer image

Copyright © 2007 by Microsoft Corporation. Alle Rechte vorbehalten.