Как обрабатывать заголовки протокола 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, не определяемых веб-службой, но запрашиваемых клиентом веб-службы

  1. Действуйте согласно шагам обработки неизвестных заголовков SOAP от клиента веб-службы, уделяя особое внимание свойству DidUnderstand заголовка SOAP.

    Для заголовков SOAP, не определяемых веб-службой, первоначальное значение свойства DidUnderstandfalse. Если после возврата результата методом веб-службы ASP.NET обнаруживает заголовки SOAP со значением false свойства DidUnderstand, автоматически вызывается исключение SoapHeaderException.

Обработка заголовков SOAP, запрашиваемых клиентом веб-службы и определяемых веб-службой

  1. Действуйте согласно шагам обработки заголовков 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
y4t36w86.note(ru-ru,VS.100).gifПримечание
Свойство DidUnderstand используется ASP.NET для взаимодействия с методом веб-службы. Оно не входит в спецификацию SOAP; его значение не отображается ни в одной части запроса или ответа SOAP.

y4t36w86.note(ru-ru,VS.100).gifПримечание
Если веб-служба пересылает заголовок SOAP, очень важно соблюдать правила спецификации SOAP, особенно касающиеся значения Actor. Подробные сведения см. на веб-сайте W3C (http://www.w3.org/TR/SOAP/).

См. также

Справочник

SoapHeader
SoapHeaderAttribute
SoapUnknownHeader
SoapHeaderException

Основные понятия

Создание клиентов XML-веб-службы

Другие ресурсы

Использование заголовков SOAP
XML-веб-службы с использованием ASP.NET