Как обрабатывать заголовки протокола SOAP, запрашиваемых клиентом XML-веб-службы
Этот раздел посвящен технологии прежних версий. Веб-службы XML и клиенты веб-служб XML должны создаваться с использованием Windows Communication Foundation.
Пример кода
Клиент может требовать от метода веб-службы правильной интерпретации семантики заголовка протокола SOAP и соответствующей обработки этого заголовка для успешного выполнения запроса SOAP. Для этого клиенты устанавливают атрибут mustUnderstand заголовка SOAP в значение 1. Например, следующий SOAP-запрос требует от получателя обрабатывать заголовок SOAP MyCustomSoapHeader
.
<?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>
Обработка веб-службой запрашиваемых клиентом заголовков SOAP зависит от того, определяется ли заголовок SOAP веб-службой. В том случае, когда заголовок SOAP определяется веб-службой, большое участие в обработке принимает ASP.NET. В представленной ниже процедуре поясняется, как осуществляется обработка в двух случаях.
Обработка заголовков SOAP, не определяемых веб-службой, но запрашиваемых клиентом веб-службы
Действуйте согласно шагам обработки неизвестных заголовков SOAP от клиента веб-службы, уделяя особое внимание свойству DidUnderstand заголовка SOAP.
Для заголовков SOAP, не определяемых веб-службой, первоначальное значение свойства DidUnderstand — false. Если после возврата результата методом веб-службы ASP.NET обнаруживает заголовки SOAP со значением false свойства DidUnderstand, автоматически вызывается исключение SoapHeaderException.
Обработка заголовков SOAP, запрашиваемых клиентом веб-службы и определяемых веб-службой
Действуйте согласно шагам обработки заголовков SOAP в веб-службе, созданной с помощью ASP.NET, в каждом методе веб-службы.
Для заголовков SOAP, определяемых веб-службой и обрабатываемых в методе веб-службы, который принимает заголовок SOAP, ASP.NET предполагает, что веб-служба понимает заголовок SOAP и в качестве первоначального значения свойства DidUnderstand устанавливает значение true.
Пример
Представленная ниже веб-служба MyWebService
определяет заголовок SOAP MyHeader
и требует его передачи при любых вызовах метода MyWebMethod
веб-службы. Кроме того, метод MyWebMethod
обрабатывает любые неизвестные заголовки SOAP. Для заголовков SOAP, которые могут обрабатываться методом MyWebMethod
, свойству DidUnderstand присваивается значение true.
<%@ 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
Примечание |
---|
Свойство DidUnderstand используется ASP.NET для взаимодействия с методом веб-службы. Оно не входит в спецификацию SOAP; его значение не отображается ни в одной части запроса или ответа SOAP. |
Примечание |
---|
Если веб-служба пересылает заголовок SOAP, очень важно соблюдать правила спецификации SOAP, особенно касающиеся значения Actor. Подробные сведения см. на веб-сайте W3C (http://www.w3.org/TR/SOAP/). |
См. также
Справочник
SoapHeader
SoapHeaderAttribute
SoapUnknownHeader
SoapHeaderException
Основные понятия
Создание клиентов XML-веб-службы
Другие ресурсы
Использование заголовков SOAP
XML-веб-службы с использованием ASP.NET