Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die Kommunikation mit einer XML-Webdienstmethode mittels SOAP basiert auf einem Standardformat. Einen Teil dieses Formats bilden die Daten, die in einem XML-Dokument codiert sind. Das XML-Dokument besteht aus einem Envelope-Stammtag, das wiederum aus einem erforderlichen Body-Element und einem optionalen Header-Element besteht. Das Body-Element umfasst die meldungsspezifischen Daten. Das optionale Header-Element kann zusätzliche Informationen enthalten, die sich nicht direkt auf eine bestimmte Meldung beziehen. Jedes untergeordnete Element des Header-Elements wird als SOAP-Header bezeichnet.
Grundsätzlich ist es möglich, dass SOAP-Header zur Meldung gehörige Daten enthalten, da der Inhalt eines SOAP-Headers durch die SOAP-Spezifikation nicht streng vorgegeben wird. Normalerweise enthalten die Header jedoch Informationen, die innerhalb eines Webservers von der Infrastruktur verarbeitet werden. Ein SOAP-Header könnte beispielsweise verwendet werden, um Routinginformationen für die SOAP-Meldung darin anzugeben.
Definieren und Verarbeiten von SOAP-Headern
SOAP-Header können durch XML-Webdienste, die mit ASP.NET erstellt wurden, definiert und bearbeitet werden. Zur Definition eines SOAP-Headers wird eine Klasse definiert, die die Daten in einem bestimmten SOAP-Header darstellt und die von der SoapHeader-Klasse abgeleitet wird.
So definieren Sie eine Klasse, die einen SOAP-Header darstellt
Erstellen Sie eine von der SoapHeader-Klasse abgeleitete Klasse, deren Name dem Stammelement für den SOAP-Header entspricht.
public class MyHeader : SoapHeader [Visual Basic] Public Class MyHeader : Inherits SoapHeaderFügen Sie öffentliche Felder oder Eigenschaften hinzu, und ordnen Sie für jedes Element im SOAP-Header Namen und entsprechende Datentypen einander zu.
Beim folgenden SOAP-Header würde durch die darauf folgende Klasse eine Klasse definiert werden, die den SOAP-Header darstellt.
public class MyHeader : SoapHeader { public DateTime Created; public long Expires; } [Visual Basic] Public Class MyHeader Inherits SoapHeader Public Created As DateTime Public Expires As Long End Class
So verarbeiten Sie SOAP-Header innerhalb eines XML-Webdienstes
Fügen Sie der Klasse, die den XML-Webdienst entsprechend dem durch den SOAP-Header dargestellten Typ implementiert, einen öffentlichen Member hinzu.
[WebService(Namespace="https://www.contoso.com")] public class MyWebService { // Add a member variable of the type deriving from SoapHeader. public MyHeader timeStamp; [Visual Basic] <WebService(Namespace:="https://www.contoso.com")> _ Public Class MyWebService ' Add a member variable of the type deriving from SoapHeader. Public TimeStamp As MyHeaderWenden Sie auf jede XML-Webdienstmethode, durch die der SOAP-Header verarbeitet werden soll, ein SoapHeader-Attribut an. Setzen Sie die MemberName-Eigenschaft des SoapHeader-Attributs auf den Namen der in Schritt 1 erstellten Membervariablen.
[WebMethod] [SoapHeader("timeStamp")] public void MyWebMethod() [Visual Basic] <WebMethod, SoapHeader("TimeStamp")> _ Public Sub MyWebMethod()Greifen Sie innerhalb der einzelnen XML-Webdienstmethoden, auf die das SoapHeader-Attribut angewendet wird, auf die unter Schritt 1 erstellte Membervariable zu, um die im SOAP-Header gesendeten Daten zu verarbeiten.
[WebMethod] [SoapHeader("timeStamp", Direction=SoapHeaderDirection.InOut)] public string MyWebMethod() { // Verify that the client sent the SOAP Header. if (timeStamp == null) { timeStamp = new MyHeader(); } // Set the value of the SoapHeader returned // to the client. timeStamp.Expires = 60000; timeStamp.Created = DateTime.UtcNow; return "Hello World"; } [Visual Basic] <WebMethod,SoapHeader("TimeStamp", _ Direction:=SoapHeaderDirection.InOut)> _ Public Function MyWebMethod() As String ' Verify that the client sent the SOAP Header. If (TimeStamp Is Nothing) Then TimeStamp = New MyHeader End If ' Set the value of the SoapHeader returned ' to the client. TimeStamp.Expires = 60000 TimeStamp.Created = DateTime.UtcNow Return "Hello World" End Function
Im folgenden Codebeispiel wird veranschaulicht, wie Sie einen SOAP-Header in einem mit ASP.NET erstellten XML-Webdienst definieren und verarbeiten. Der XML-Webdienst MyWebService verfügt über eine Membervariable namens timeStamp, die einen von SoapHeader (MyHeader) abgeleiteten Typ aufweist und die auf die MemberName-Eigenschaft des SoapHeader-Attributs gesetzt ist. Zusätzlich wird ein SoapHeader-Attribut auf die XML-Webdienstmethode MyWebMethod angewendet, durch die myHeaderMemberVariable festgelegt wird. In der XML-Webdienstmethode MyWebMethod wird auf myHeaderMemberVariable zugegriffen, um den Wert der XML-Elemente Created und Expires des SOAP-Headers festzulegen.
<%@ WebService Language="C#" Class="MyWebService" %>
using System;
using System.Web.Services;
using System.Web.Services.Protocols;
// Define a SOAP header by deriving from the SoapHeader class.
public class MyHeader : SoapHeader
{
public DateTime Created;
public long Expires;
}
[WebService(Namespace="https://www.contoso.com")]
public class MyWebService : System.Web.Services.WebService
{
// Add a member variable of the type deriving from SoapHeader.
public MyHeader timeStamp;
// Apply a SoapHeader attribute.
[WebMethod]
[SoapHeader("timeStamp", Direction=SoapHeaderDirection.InOut)]
public string HelloWorld()
{
if (timeStamp == null)
timeStamp = new MyHeader();
timeStamp.Expires = 60000;
timeStamp.Created = DateTime.UtcNow;
return "Hello World";
}
}
[Visual Basic]
<%@ WebService Language="VB" Class="MyWebService" %>
Imports System
Imports System.Web.Services
Imports System.Web.Services.Protocols
' Define a SOAP header by deriving from the SoapHeader class.
Public Class MyHeader
Inherits SoapHeader
Public Created As DateTime
Public Expires As Long
End Class
<WebService(Namespace:="https://www.contoso.com")> _
Public Class MyWebService
Inherits System.Web.Services.WebService
' Add a member variable of the type deriving from SoapHeader.
Public timeStamp As MyHeader
' Apply a SoapHeader attribute.
<WebMethod(), _
SoapHeader("timeStamp", Direction:=SoapHeaderDirection.InOut)> _
Public Function HelloWorld() As String
If (timeStamp Is Nothing) Then
timeStamp = New MyHeader
End If
timeStamp.Expires = 60000
timeStamp.Created = DateTime.UtcNow
Return "Hello World"
End Function
End Class
Im vorherigen Beispiel wird eine SOAP-Antwort an den Client zurückgegeben, wobei das Expires-Element auf 60000 (Millisekunden, d. h. 1 Minute) festgelegt und das Created-Element auf die aktuelle Uhrzeit in koordinierter Weltzeit. Das heißt, die folgende SOAP-Antwort wird an den Client gesendet.
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<MyHeader xmlns="https://www.contoso.com">
<Created>dateTime</Created>
<Expires>long</Expires>
</MyHeader>
</soap:Header>
<soap:Body>
<MyWebMethod xmlns="https://www.contoso.com" />
</soap:Body>
</soap:Envelope>
Erstellen eines Clients, der SOAP-Header verarbeitet
Ein XML-Webdienstclient kann SOAP-Header bei der Kommunikation mit einem XML-Webdienst senden und empfangen. Wenn eine Proxyklasse mit dem Dienstprogramm Wsdl.exe für einen XML-Webdienst erstellt wird, der SOAP-Header erwartet oder zurückgibt, enthält die Proxyklasse Informationen über die SOAP-Header. Die Proxyklasse verfügt also genauer ausgedrückt über Membervariablen, die die SOAP-Header darstellen, die mit den SOAP-Headern im XML-Webdienst in Wechselbeziehung stehen. Die Proxyklasse verfügt außerdem über Definitionen für die entsprechenden Klassen, die die SOAP-Header darstellen. Die für den vorherigen XML-Webdienst erstellten Proxyklassen enthalten beispielsweise eine Membervariable vom Typ MyHeader sowie eine Definition für die MyHeader-Klasse. Ausführliche Informationen zum Erstellen einer Proxyklasse finden Sie unter Erstellen eines XML-Webdienstproxys.
Hinweis: Wenn der XML-Webdienst die Membervariablen definiert, die SOAP-Header vom Typ SoapHeader oder SoapUnknownHeader und keine von SoapHeader abgeleitete Klasse darstellen, enthält die Proxyklasse keine Informationen über diesen SOAP-Header.
So verarbeiten Sie SOAP-Header innerhalb eines XML-Webdienstclients
Erstellen Sie eine neue Instanz der Klasse, die den SOAP-Header darstellt.
Dim mySoapHeader As MyHeader = New MyHeader() [C#] MyHeader mySoapHeader = new MyHeader();Geben Sie die Werte für den SOAP-Header an.
header.Expires = 60000 header.Created = DateTime.UtcNow [C#] header.Expires = 60000; header.Created = DateTime.UtcNow;Erstellen Sie eine neue Instanz der Proxyklasse.
Dim proxy As MyWebService = New MyWebService() [C#] MyWebService proxy = new MyWebService();Weisen Sie der Membervariablen der Proxyklasse, die den SOAP-Header darstellt, das SOAP-Headerobjekt zu.
proxy.MyHeaderValue = mySoapHeader [C#] proxy.MyHeaderValue = mySoapHeaderRufen Sie die Methode für die Proxyklasse auf, die mit der XML-Webdienstmethode kommuniziert.
Der SOAP-Headerbereich der an den XML-Webdienst gesendeten SOAP-Anforderung enthält den Inhalt der im SOAP-Headerobjekt gespeicherten Daten.
Dim results as String = proxy.MyWebMethod() [C#] string results = proxy.MyWebMethod();
Im folgenden Codebeispiel wird veranschaulicht, wie Sie einen SOAP-Header von einem Client an einen XML-Webdienst übergeben.
<%@ Page Language="VB" %>
<asp:Label id="ReturnValue" runat="server" />
<script runat=server language=VB>
Sub Page_Load(o As Object, e As EventArgs)
Dim header As MyHeader = New MyHeader() ' Populate the values of the SOAP header. header.Expires = 60000 header.Created = DateTime.UtcNow
' Create a new instance of the proxy class.
Dim proxy As MyWebService = New MyWebService()
' Add the MyHeader SOAP header to the SOAP request. proxy.MyHeaderValue = header
' Call the method on the proxy class that communicates
' with your XML Web service method.
Dim results as String = proxy.MyWebMethod()
' Display the results of the method in a label.
ReturnValue.Text = results
End Sub
</script>
[C#]
<%@ Page Language="C#" %>
<asp:Label id="ReturnValue" runat="server" />
<script runat=server language=c#>
void Page_Load(Object o, EventArgs e)
{
MyHeader header = new MyHeader(); // Populate the values of the SOAP header. header.Expires = 60000; header.Created = DateTime.UtcNow;
// Create a new instance of the proxy class.
MyWebService proxy = new MyWebService();
// Add the MyHeader SOAP header to the SOAP request. proxy.MyHeaderValue = header;
// Call the method on the proxy class that communicates
// with your XML Web service method.
string results = proxy.MyWebMethod();
// Display the results of the method in a label.
ReturnValue.Text = results;
}
</script>
Ändern der Empfänger von SOAP-Headern
SOAP-Header werden automatisch von einem XML-Webdienstclient an eine XML-Webdienstmethode gesendet, nachdem ein SoapHeader-Attribut auf eine XML-Webdienstmethode angewendet wurde. Ein SOAP-Header kann von der XML-Webdienstmethode jedoch auch zurück an den XML-Webdienstclient gesendet werden. Der Header kann auch bidirektional gesendet werden. Durch das Festlegen der Direction-Eigenschaft eines SoapHeader-Attributs, das auf eine XML-Webdienstmethode angewendet wird, wird gesteuert, an welche Empfänger der SOAP-Header gesendet wird. Die Direction-Eigenschaft hat den Typ SoapHeaderDirection, der über die vier Werte In, Out, InOut und Fault verfügt. Diese beziehen sich jeweils auf den Empfänger (ob es sich um den XML-Webdienstserver handelt), auf den Client, oder sowohl auf den XML-Webdienstserver als auch den Client und darauf, ob der SOAP-Header beim Auslösen einer Ausnahme durch den XML-Webdienstserver an den Client gesendet wird.
Hinweis: Version 1.0 von .NET Framework SDK unterstützt den Fault-Wert nicht.
So ändern Sie den Empfänger des SOAP-Headers
Definieren Sie den SOAP-Header.
public class MyHeader : SoapHeader { public DateTime Created; public long Expires; } [Visual Basic] Public Class MyHeader Inherits SoapHeader Public Created As DateTime Public Expires As Long End ClassFügen Sie der Klasse, durch die der XML-Webdienst implementiert wird, eine Membervariable hinzu.
[WebService(Namespace="https://www.contoso.com")] public class MyWebService : WebService { public MyHeader myOutHeader; [Visual Basic] <WebService(Namespace:="https://www.contoso.com")> _ Public Class MyWebService Inherits WebService Public myOutHeader As MyHeaderWenden Sie auf jede XML-Webdienstmethode, die den SOAP-Header verarbeitet, ein SoapHeader-Attribut an. Legen Sie die Direction-Eigenschaft für die einzelnen beabsichtigten Empfänger fest, indem Sie die SoapHeaderDirection-Enumeration verwenden. Im folgenden Beispiel wird der XML-Webdienstclient als Empfänger festgelegt, indem Direction auf SoapHeaderDirection.Out gesetzt wird.
[WebMethod] [SoapHeader("myOutHeader",Direction=SoapHeaderDirection.Out)] [Visual Basic] <WebMethod, _ SoapHeader("myOutHeader",Direction:=SoapHeaderDirection.Out)>Je nach Empfänger können Sie den SOAP-Header jetzt verarbeiten oder festlegen. Im folgenden Codebeispiel werden die Werte des SOAP-Headers festgelegt, da es sich beim Empfänger um den XML-Webdienstclient handelt.
// Set the Time the SOAP message expires. myOutHeader.Expires = 60000; myOutHeader.Created = DateTime.UtcNow; [Visual Basic] ' Set the Time the SOAP message expires. myOutHeader.Expires = 60000 myOutHeader.Created = DateTime.UtcNow
Im folgenden Codebeispiel wird der SOAP-Header MyHeader definiert, der von der XML-Webdienstmethode an den Client gesendet wird.
<%@ WebService Language="C#" Class="MyWebService" %>
using System;
using System.Web.Services;
using System.Web.Services.Protocols;
// Define a SOAP header by deriving from the SoapHeader class.
public class MyHeader : SoapHeader
{
public DateTime Created;
public long Expires;
}
[WebService(Namespace="https://www.contoso.com")]
public class MyWebService : WebService
{
public MyHeader myOutHeader;
[WebMethod]
[SoapHeader("myOutHeader",Direction=SoapHeaderDirection.Out)]
public void MyOutHeaderMethod()
{
// Set the time the SOAP message expires.
myOutHeader.Expires = 60000;
myOutHeader.Created = DateTime.UtcNow;
}
}
[Visual Basic]
<%@ WebService Language="VB" Class="MyWebService" %>
Imports System
Imports System.Web.Services
Imports System.Web.Services.Protocols
' Define a SOAP header by deriving from the SoapHeader class.
Public Class MyHeader
Inherits SoapHeader
Public Created As DateTime
Public Expires As Long
End Class
<WebService(Namespace:="https://www.contoso.com")> _
Public Class MyWebService
Inherits WebService
Public myOutHeader As MyHeader
<WebMethod, _
SoapHeader("myOutHeader",Direction:=SoapHeaderDirection.Out)> _
Public Sub MyOutHeaderMethod()
' Set the time the SOAP message expires.
myOutHeader.Expires = 60000
myOutHeader.Created = DateTime.UtcNow
End Sub
End Class
Behandeln unbekannter SOAP-Header
Ein XML-Webdienstclient kann eine SOAP-Anforderung mit einem SOAP-Header an eine XML-Webdienstmethode senden, während der SOAP-Header vom XML-Webdienst möglicherweise nicht explizit erwartet wurde. In diesem Fall sollte festgestellt werden, ob die Semantik des SOAP-Headers verstanden und verarbeitet wird. Gemäß der SOAP-Spezifikation wird eine Ausnahme ausgelöst, wenn SOAP-Header über ein mustUnderstand-Attribut mit dem Wert true verfügen. Einzelheiten zum Behandeln von SOAP-Headern, die von einem Client benötigt werden, finden Sie unter Behandeln von SOAP-Headern, die von einem XML-Webdienstclient benötigt werden.
So behandeln Sie unbekannte SOAP-Header von einem XML-Webdienstclient aus
Fügen Sie der Klasse, durch die der XML-Webdienst implementiert wird, eine Membervariable vom Typ SoapUnknownHeader oder SoapHeader bzw. ein Array aus beiden hinzu, um mehrere unbekannte SOAP-Header zu behandeln.
Die Deklaration des Typs als Array oder als einzelne Instanz von SoapUnknownHeader hat den zusätzlichen Vorteil, dass SoapUnknownHeader über eine Element-Eigenschaft verfügt. Die Element-Eigenschaft ist vom Typ XmlElement und stellt das XML-Dokument für das Header-Element der SOAP-Anforderung bzw. SOAP-Antwort dar. Eine XML-Webdienstmethode kann folglich den Namen des SOAP-Headers zusammen mit den vom SOAP-Header übermittelten Daten ermitteln, indem sie die Element-Eigenschaft abfragt.
public class MyWebService { public SoapUnknownHeader[] unknownHeaders; [Visual Basic] Public Class MyWebService Public unknownHeaders() As SoapUnknownHeaderWenden Sie auf jede XML-Webdienstmethode, die die Verarbeitung aller unbekannten SOAP-Header beabsichtigt, ein SoapHeader-Attribut an.
[WebMethod] [SoapHeader("unknownHeaders")] public string MyWebMethod() [Visual Basic] <WebMethod, _ SoapHeader("unknownHeaders") > _ Public Function MyWebMethod() As StringFügen Sie Code hinzu, um festzustellen, ob Sie unbekannte SOAP-Header verarbeiten können.
Wenn die Membervariable den Typ SoapUnknownHeader aufweist, kann eine XML-Webdienstmethode den Namen des SOAP-Headers zusammen mit den vom SOAP-Header übermittelten Daten ermitteln, indem sie die Element-Eigenschaft abfragt. Durch die Name-Eigenschaft der Element-Eigenschaft wird der Name des SOAP-Headers identifiziert.
foreach (SoapUnknownHeader header in unknownHeaders) { // Check to see if this a known header. if (header.Element.Name == "MyKnownHeader") [Visual Basic] Dim header As SoapUnknownHeader For Each header In unknownHeaders ' Check to see if this is a known header. If (header.Element.Name = "MyKnownHeader") ThenLegen Sie die DidUnderstand-Eigenschaft der Membervariablen, die den unbekannten SOAP-Header darstellt, auf true fest, wenn bekannt ist, wie ein bestimmter SOAP-Header verarbeitet wird.
Wenn eine XML-Webdienstmethode einen unbekannten SOAP-Header verarbeitet und die DidUnderstand-Eigenschaft nicht auf true festlegt, kann eine SoapHeaderException ausgelöst werden. Ausführliche Informationen erhalten Sie unter Behandeln von SOAP-Headern, die von einem XML-Webdienstclient benötigt werden.
// 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; } [Visual Basic] ' 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 IfHinweis Die DidUnderstand-Eigenschaft wird von den mit ASP.NET erstellten XML-Webdiensten für die Kommunikation mit der XML-Webdienstmethode verwendet. Diese Eigenschaft ist in der SOAP-Spezifikation nicht enthalten. Ihr Wert kommt in der SOAP-Anforderung bzw. SOAP-Antwort nicht vor.
Hinweis Wenn eine Proxyklasse von einem XML-Webdienstclient mit dem Web Services Description Language-Tool (Wsdl.exe) erstellt und die Membervariable, die einen SOAP-Header darstellt, von einem XML-Webdienst mit dem Typ SoapUnknownHeader definiert wird, wird der Proxyklasse kein Verweis auf diesen SOAP-Header hinzugefügt. Wenn ein XML-Webdienstclient entscheidet, diesen SOAP-Header der SOAP-Anforderung hinzuzufügen, muss die Proxyklasse angepasst werden, indem eine Membervariable hinzugefügt und ein SoapHeader-Attribut auf die Methode angewendet wird, die den Aufruf der zugehörigen XML-Webdienstmethode ausführt.
Behandeln von SOAP-Headern, die von einem XML-Webdienstclient benötigt werden
Ein Client kann u. U. erfordern, dass eine XML-Webdienstmethode die Semantik des SOAP-Headers richtig interpretiert und angemessen verarbeitet, damit die SOAP-Anforderung erfolgreich verläuft. Zu diesem Zweck müssen Clients das mustUnderstand-Attribut des SOAP-Headers auf 1 setzen. Die folgende SOAP-Anforderung erfordert vom Empfänger der SOAP-Anforderung beispielsweise, dass der SOAP-Header MyCustomSoapHeader verarbeitet wird.
<?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 XML-Webdienst die vom Client benötigten SOAP-Header behandelt, hängt davon ab, ob der SOAP-Header vom XML-Webdienst definiert wird oder nicht. Für den Fall, dass der SOAP-Header vom XML-Webdienst definiert wird, führt ASP.NET einen Großteil der Arbeit aus. Der folgenden Prozedur können Sie entnehmen, wie die beiden Fälle behandelt werden.
So behandeln Sie vom XML-Webdienst nicht definierte, aber von einem XML-Webdienstclient benötigte SOAP-Header
Führen Sie die Schritte zur Behandlung unbekannter SOAP-Header von einem XML-Webdienstclient aus, und achten Sie besonders auf die DidUnderstand-Eigenschaft des SOAP-Headers.
Bei SOAP-Headern, die nicht vom XML-Webdienst definiert wurden, ist der Anfangswert von DidUnderstand auf false gesetzt. Wenn ASP.NET nach der Rückkehr der XML-Webdienstmethode SOAP-Header ermittelt, deren DidUnderstand-Eigenschaft auf false gesetzt ist, wird automatisch eine SoapHeaderException ausgelöst.
So behandeln Sie von einem XML-Webdienstclient benötigte und vom XML-Webdienst definierte SOAP-Header
Führen Sie innerhalb jeder XML-Webdienstmethode die Schritte für die Verarbeitung von SOAP-Headern in einem mit ASP.NET erstellten XML-Webdienst aus.
Bei SOAP-Headern, die vom XML-Webdienst definiert und in der XML-Webdienstmethode, die den SOAP-Header empfängt, verarbeitet werden, setzt ASP.NET voraus, dass der XML-Webdienst den SOAP-Header versteht, und setzt den Anfangswert von DidUnderstand auf true.
Vom folgenden XML-Webdienst MyWebService wird der SOAP-Header MyHeader definiert, und es wird festgelegt, dass dieser bei jedem Aufruf der XML-Webdienstmethode MyWebMethod mitgesendet werden muss. 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";
}
}
[Visual Basic]
<%@ 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
Hinweis Die DidUnderstand-Eigenschaft wird von ASP.NET verwendet, um mit der XML-Webdienstmethode zu kommunizieren. Diese Eigenschaft ist in der SOAP-Spezifikation nicht enthalten; ihr Wert kommt weder in der SOAP-Anforderung noch in der SOAP-Antwort vor.
Wenn ein XML-Webdienst einen SOAP-Header weiterleitet, müssen die Richtlinien in der SOAP-Spezifikation unbedingt beachtet werden, insbesondere jene, die den Wert von Actor betreffen. Ausführliche Informationen finden Sie auf der W3C-Website unter http://www.w3.org/TR/SOAP/ (nur auf Englisch verfügbar).
Behandeln von Fehlern, die bei der Verarbeitung eines SOAP-Headers auftreten
Wenn ein XML-Webdienst einen Fehler erkennt, der spezifisch für die Verarbeitung des Headers ist, sollte eine SoapHeaderException ausgelöst werden. Diese Ausnahmeklasse ermöglicht XML-Webdiensten die richtige Formatierung der Antwort. Wenn der Client mit Hilfe von .NET Framework erstellt wird, empfängt er die SoapHeaderException mit ihrem Inhalt, einschließlich der InnerException-Eigenschaft, die sich in der Message-Eigenschaft befindet. Die InnerException-Eigenschaft der vom Client abgefangenen SoapHeaderException ist null. Dieses Programmiermodell wird von .NET Framework unterstützt, da die Ausnahme im SOAP-XML-Element <Fault> im Netzwerk gesendet wird, wie in der SOAP-Spezifikation vorgegeben. Ausführliche Informationen zu Ausnahmen finden Sie unter Behandeln und Auslösen von Ausnahmen in XML-Webdiensten.
Das folgende Codebeispiel löst eine SoapHeaderException-Ausnahme aus, wenn ein Client eine SOAP-Anforderung an die MyWebMethod-XML-Webdienstmethode sendet, die die Expires-Eigenschaft auf einen Zeitpunkt (Datum und Uhrzeit) festlegt, der bereits vergangen ist, wenn die SOAP-Anforderung den XML-Webdienst erreicht.
<%@ WebService Language="C#" Class="MyWebService" %>
using System.Web.Services;
using System.Web.Services.Protocols;
// Define a SOAP header by deriving from the SoapHeader class.
public class MyHeader : SoapHeader
{
public DateTime Created;
public DateTime Expires;
public DateTime Received;
}
[WebService(Namespace="https://www.contoso.com")]
public class MyWebService
{
// Add a member variable of the type deriving from SoapHeader.
public MyHeader myHeaderMemberVariable;
// Apply a SoapHeader attribute.
[WebMethod]
[SoapHeader("myHeaderMemberVariable")]
public void MyWebMethod()
{
if (timeStamp == null)
timeStamp = new MyHeader();
else
{
// Check whether the SOAP message is expired.
if ((timeStamp.Expires.CompareTo(DateTime.UtcNow)) <= 0)
{
// The SOAP message is expired, so throw a SOAP header
// exception indicating that.
SoapHeaderException se = new SoapHeaderException(
"SOAP message expired before reaching this node.",
SoapException.ClientFaultCode,
this.Context.Request.Url.ToString());
throw se;
}
}
}
}
[Visual Basic]
<%@ WebService Language="VB" Class="MyWebService" %>
Imports System.Web.Services
Imports System.Web.Services.Protocols
' Define a SOAP header by deriving from the SoapHeader class.
Public Class MyHeader
Inherits SoapHeader
Public Created As DateTime
Public Expires As DateTime
Public Received As DateTime
End Class
<WebService(Namespace:="https://www.contoso.com")> _
Public Class MyWebService
' Add a member variable of the type deriving from SoapHeader.
Public myHeaderMemberVariable As MyHeader
' Apply a SoapHeader attribute.
<WebMethod, _
SoapHeader("myHeaderMemberVariable")> _
Public Sub MyWebMethod()
If (TimeStamp Is Nothing) Then
TimeStamp = New MyHeader
Else
' Check whether the SOAP message is expired.
If ((TimeStamp.Expires.CompareTo(DateTime.UtcNow)) <= 0) Then
' The SOAP message is expired, so throw a SOAP header
' exception indicating that.
Dim se As New SoapHeaderException( _
"SOAP message expired before reaching this node.", _
SoapException.ClientFaultCode, _
Me.Context.Request.Url.ToString())
Throw se
End If
End If
End Sub
End Class
Hinweis: .NET Framework, Version 1.0, enthält die SoapHeaderAttribute.Required-Eigenschaft, mit der ein XML-Webdienst fordern kann, dass ein Client einen bestimmten SOAP-Header sendet, wenn die Eigenschaft auf true festgelegt ist. ASP.NET gibt an, dass der SOAP-Header in einem erstellten WSDL-Dokument erforderlich ist, indem das wsdl:required-Attribut im soap:header-Element auf "true" festgelegt wird. .NET Framework-Clients des aus dem WSDL-Dokument erstellten XML-Webdienstes empfangen eine SoapHeaderException, wenn Sie den erforderlichen SOAP-Header nicht senden und andere Clients einen SOAP-Fehler empfangen. Um mit anderen SOAP-Implementierungen zusammenwirken zu können, wurde diese Funktionalität in späteren Versionen entfernt.
Die Required-Eigenschaft ist in Version 1.1 veraltet, und das wsdl:required-Attribut eines soap:header-Elements in einem WSDL-Dokument wird vom Web Services Description Language-Tool (Wsdl.exe) ignoriert. Da ein SOAP-Header nicht länger erforderlich sein kann, sollte ein XML-Webdienst vor dem Zugriff sicherstellen, dass das den SOAP-Header darstellende Feld oder die entsprechende Eigenschaft nicht null ist.
Siehe auch
SoapHeader | SoapHeaderAttribute | SoapHeaderException | SoapUnknownHeader | Erstellen von XML-Webdiensten mit ASP.NET | Erstellen von XML-Webdienstclients