Как определить и обработать заголовки SOAP
Этот раздел посвящен технологии прежних версий. Веб-службы XML и клиенты веб-служб XML должны создаваться с использованием Windows Communication Foundation.
Пример кода
Веб-службы, созданные с помощью ASP.NET, могут определять заголовки SOAP и манипулировать ими. Для определения заголовка SOAP определяется класс, представляющий данные в конкретном заголовке SOAP, и этот класс делается производным класса SoapHeader.
Определение класса, представляющего заголовок SOAP
Создайте класс, являющийся производным класса SoapHeader, с именем, соответствующим корневому элементу для заголовка SOAP.
public class MyHeader : SoapHeader
Public Class MyHeader : Inherits SoapHeader
Добавьте открытые поля или свойства, соответствующие именам и связанным с ними типам данных, для каждого элемента в заголовке SOAP.
Например, для представленного ниже заголовка SOAP следующий за ним класс определяет класс, представляющий заголовок SOAP.
<soap:Header xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/"> <MyHeader xmlns="https://www.contoso.com"> <Created>dateTime</Expires> <Expires>long</Expires> </MyHeader> </soap:Header> public class MyHeader : SoapHeader { public DateTime Created; public long Expires; }
Public Class MyHeader : Inherits SoapHeader Public Created As DateTime Public Expires As Long End Class
Обработка заголовков SOAP в веб-службе
Добавьте открытый член в класс, реализующий веб-службу и представляющий заголовок SOAP.
[WebService(Namespace="https://www.contoso.com")] public class MyWebService { // Add a member variable of the type deriving from SoapHeader. public MyHeader timeStamp;
<WebService(Namespace:="https://www.contoso.com")> _ Public Class MyWebService ' Add a member variable of the type deriving from SoapHeader. Public TimeStamp As MyHeader
Примените атрибут SoapHeader для каждого метода веб-службы, который должен обрабатывать заголовок SOAP. Задайте для свойства MemberName атрибута SoapHeader имя созданной на первом шаге переменной члена.
[WebMethod] [SoapHeader("timeStamp")] public void MyWebMethod()
<WebMethod, SoapHeader("TimeStamp")> _ Public Sub MyWebMethod()
В каждом методе веб-службы, для которого применен атрибут SoapHeader, обратитесь к созданной на первом шаге переменной члена для обработки данных, отправленных в заголовок SOAP.
[WebMethod] [SoapHeader("myHeaderMemberVariable")] 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!"); }
<WebMethod,SoapHeader("TimeStamp", _ Direction:=SoapHeaderDirection.InOut)> _ Public Function MyWebMethod() As String ' Process the SoapHeader. If (TimeStamp Is Nothing) Then TimeStamp = New MyHeader End If TimeStamp.Expires = 60000 TimeStamp.Created = DateTime.UtcNow Return "Hello World!" End Function
Пример
В следующем примере кода показано, как определить и обработать заголовок SOAP в веб-службе, созданной с помощью ASP.NET. Веб-служба MyWebService
содержит переменную-член с именем myHeaderMemberVariable
, которая имеет тип, производный от SoapHeader (MyHeader
). Значением переменной является свойство MemberName атрибута SoapHeader. Кроме того, атрибут SoapHeader применяется для метода веб-службы MyWebMethod
с указанием переменной myHeaderMemberVariable
. В методе веб-службы MyWebMethod
осуществляется обращение к переменной myHeaderMemberVariable
для получения значения элемента XML Username
заголовка SOAP.
<%@ 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 long Expires;
}
[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()
{
// Process the SoapHeader.
if (myHeaderMemberVariable.Username == "admin")
{
// Do something interesting.
}
}
}
<%@ 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 Username As String
Public Password As String
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()
' Process the SoapHeader.
If (myHeaderMemberVariable.Username = "admin") Then
' Do something interesting.
End If
End Sub
End Class
Если в предыдущем примере запрос SOAP, направляемый в метод MyWebMethod
, имеет заголовок SOAP MyHeader
, элементу UserName
которого присвоено значение Admin
, выполняется дополнительный код. То есть следующий запрос SOAP приводит к выполнению этого кода.
<?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>
См. также
Справочник
SoapHeader
SoapHeaderAttribute
SoapUnknownHeader
SoapHeaderException
Основные понятия
Создание клиентов XML-веб-службы
Другие ресурсы
Использование заголовков SOAP
XML-веб-службы с использованием ASP.NET