次の方法で共有


SOAP ヘッダーの使用

SOAP を使用した XML Web サービス メソッドとの通信では、標準書式に従います。標準書式の一部のデータは、XML ドキュメントでエンコードされます。XML ドキュメントはルート Envelope タグで構成され、さらにそのタグは必須の Body 要素および省略可能な Header 要素で構成されます。Body 要素はメッセージ固有のデータで構成されます。省略可能な Header 要素には、特定のメッセージに直接は関連しない追加情報を含めることができます。Header 要素の各子要素は SOAP ヘッダーと呼ばれます。

SOAP ヘッダーにはメッセージに関連するデータを含めることができますが、SOAP 仕様では SOAP ヘッダーの内容が厳密に定義されていないため、一般的には Web サーバー内のインフラストラクチャによって処理される情報が含まれます。SOAP ヘッダーの使用例としては、SOAP ヘッダー内に SOAP メッセージのルーティング情報を含める場合などがあります。

SOAP ヘッダーの定義および処理

ASP.NET を使用して作成した XML Web サービスでは、SOAP ヘッダーを定義および操作できます。SOAP ヘッダーの定義は、特定の SOAP ヘッダーのデータを表すクラスを定義し、そのクラスを SoapHeader クラスから派生させることによって実現できます。

SOAP ヘッダーを表すクラスを定義するには

  1. SOAP ヘッダーのルート要素名と一致する名前のクラスを SoapHeader クラスから派生させます。

    public class MyHeader : SoapHeader
    [Visual Basic]
    Public Class MyHeader : Inherits SoapHeader
    
  2. SOAP ヘッダーにある各要素の名前とそれに対応するデータ型と一致するパブリック フィールドまたはプロパティを追加します。

    たとえば、次のような SOAP ヘッダーがある場合、その後に示すクラスがこの SOAP ヘッダーを定義しています。

    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
    

XML Web サービス内で SOAP ヘッダーを処理するには

  1. SOAP ヘッダーを表す型の XML Web サービスを実装するクラスにパブリック メンバを追加します。

    [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 MyHeader
    
  2. SOAP ヘッダーを処理する各 XML Web サービス メソッドに SoapHeader 属性を適用します。SoapHeader 属性の MemberName プロパティとして、最初の手順で作成したメンバ変数の名前を設定します。

    [WebMethod]
    [SoapHeader("timeStamp")]
    public void MyWebMethod()
    [Visual Basic]
    <WebMethod, SoapHeader("TimeStamp")> _ 
    Public Sub MyWebMethod()
    
  3. SoapHeader 属性を適用する XML Web サービス メソッド内で、最初の手順で作成したメンバ変数にアクセスし、SOAP ヘッダーで送信されたデータを処理します。

    [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
    

ASP.NET を使用して作成した XML Web サービスで SOAP ヘッダーを定義および処理する方法を次のコード例に示します。MyWebService XML Web サービスには、timeStamp という名前のメンバ変数があります。この変数の型は SoapHeader (MyHeader) から派生した型であり、その値は SoapHeader 属性の MemberName プロパティに設定されます。さらに、SoapHeader 属性が、myHeaderMemberVariable を指定する MyWebMethod XML Web サービス メソッドに適用されます。MyWebMethod XML Web サービス メソッド内で、myHeaderMemberVariable にアクセスして、SOAP ヘッダーの Created XML 要素と Expires XML 要素の値を設定します。

<%@ 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

上の例では、クライアントに返される SOAP 応答の Expires 要素は 60000 (ミリ秒単位、つまり 1 分) に、また、Created 要素は世界協定時刻での現在の時刻に設定されます。つまり、次の 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>

SOAP ヘッダーを処理するクライアントの作成

XML Web サービス クライアントでは、XML Web サービスとの通信時に SOAP ヘッダーを送受信できます。Wsdl.exe ユーティリティを使用して、SOAP ヘッダーを要求したり返したりする XML Web サービス用のプロキシ クラスを生成すると、そのプロキシ クラスには該当の SOAP ヘッダーに関する情報が含まれます。具体的には、プロキシ クラスには SOAP ヘッダーを表すメンバ変数があり、それらは XML Web サービスにある SOAP ヘッダーにそれぞれ関連しています。また、プロキシ クラスには、それに対応する SOAP ヘッダーを表すクラスの定義も含まれます。たとえば、上の XML Web サービスに対して生成されるプロキシ クラスには、MyHeader 型のメンバ変数と MyHeader クラスの定義が含まれます。プロキシ クラスの作成の詳細については、「XML Web サービス プロキシの作成」を参照してください。

メモ XML Web サービスで、SoapHeader から派生するクラスではなく、SoapHeader 型または SoapUnknownHeader 型の SOAP ヘッダーを表すメンバ変数を定義する場合、プロキシ クラスには SOAP ヘッダーに関する情報は含まれません。

XML Web サービス クライアント内で SOAP ヘッダーを処理するには

  1. SOAP ヘッダーを表すクラスの新しいインスタンスを作成します。

    Dim mySoapHeader As MyHeader = New MyHeader()
    [C#]
    MyHeader mySoapHeader = new MyHeader();
    
  2. SOAP ヘッダーの値を設定します。

    header.Expires = 60000
    header.Created = DateTime.UtcNow
    [C#]
    header.Expires = 60000;
    header.Created = DateTime.UtcNow;
    
  3. プロキシ クラスの新しいインスタンスを作成します。

    Dim proxy As MyWebService = New MyWebService()
    [C#]
    MyWebService proxy = new MyWebService();
    
  4. SOAP ヘッダー オブジェクトを、SOAP ヘッダーを表すプロキシ クラスのメンバ変数に割り当てます。

    proxy.MyHeaderValue = mySoapHeader
    [C#]
    proxy.MyHeaderValue = mySoapHeader
    
  5. XML Web サービス メソッドと通信するプロキシ クラスに対してメソッドを呼び出します。

    XML Web サービスに送信される SOAP 要求の SOAP ヘッダー部分には、SOAP ヘッダー オブジェクトに格納されたデータの内容が含まれます。

    Dim results as String = proxy.MyWebMethod()
    [C#]
    string results = proxy.MyWebMethod();
    

SOAP ヘッダーをクライアントから XML Web サービスに渡す方法を次のコード例に示します。

<%@ 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>

SOAP ヘッダーの受信側の変更

既定では、SoapHeader 属性が XML Web サービス メソッドに適用されている場合、XML Web サービス クライアントが送信した SOAP ヘッダーは XML Web サービス メソッドに渡されます。しかし、XML Web サービス メソッドによって SOAP ヘッダーを XML Web サービス クライアントに返信することもできます。また、SOAP ヘッダーは両方向に送信できます。XML Web サービス メソッドに適用された SoapHeader 属性の Direction プロパティを設定すると、SOAP ヘッダーの受信側を制御できます。SoapHeaderDirection 型の Direction プロパティには、InOutInOut、および Fault の 4 つの値があります。この 4 つの値は、受信側 (XML Web サービス サーバーかどうか)、クライアント、XML Web サービス サーバーとクライアントの両方、および XML Web サービスが例外をスローしたときに SOAP ヘッダーがクライアントに送信されるかどうかをそれぞれ表します。

メモ .NET Framework SDK バージョン 1.0 では、Fault 値はサポートされていません。

SOAP ヘッダーの受信側を変更するには

  1. SOAP ヘッダーを定義します。

    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
    
  2. XML Web サービスを実装するクラスにメンバ変数を追加します。

    [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 MyHeader
    
  3. SOAP ヘッダーを処理する各 XML Web サービス メソッドに SoapHeader 属性を適用します。SoapHeaderDirection 列挙体を使用して、Direction プロパティの値として目的の各受信側を設定します。DirectionSoapHeaderDirection.Out に設定することで、受信側として XML Web サービス クライアントを設定するコード例を次に示します。

        [WebMethod]
        [SoapHeader("myOutHeader",Direction=SoapHeaderDirection.Out)]
    [Visual Basic]
        <WebMethod, _
         SoapHeader("myOutHeader",Direction:=SoapHeaderDirection.Out)>
    
  4. 受信側に応じて SOAP ヘッダーを処理または設定します。受信側が XML Web サービス クライアントの場合に、SOAP ヘッダーの値を設定するコード例を次に示します。

    // 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
    

XML Web サービス メソッドからクライアントに送信される MyHeader SOAP ヘッダーを定義するコード例を次に示します。

<%@ 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

不明な SOAP ヘッダーの処理

XML Web サービス クライアントは、XML Web サービスが必要としているかどうかが明示的に定義されていない SOAP ヘッダーを、SOAP 要求に含めて XML Web サービス メソッドに送信できます。この場合、SOAP ヘッダーの mustUnderstand 属性が true に設定されていると例外がスローされることが SOAP 仕様に規定されているため、SOAP ヘッダーのセマンティクスを理解して処理しているかどうかを確認することが重要です。クライアントによって要求される SOAP ヘッダーの処理の詳細については、「XML Web サービス クライアントが必要とする SOAP ヘッダーの処理」を参照してください。

XML Web サービス クライアントからの不明な SOAP ヘッダーを処理するには

  1. XML Web サービスを実装するクラスに、複数の不明な SOAP ヘッダーを処理するために、SoapUnknownHeader 型または SoapHeader 型、あるいはそのいずれかの配列であるメンバ変数を追加します。

    この型を SoapUnknownHeader の配列または単一のインスタンスとして宣言すると、SoapUnknownHeaderElement プロパティを含めることができます。Element プロパティの型は XmlElement で、このプロパティは SOAP 要求または SOAP 応答の Header 要素の XML ドキュメントを表します。したがって、XML Web サービス メソッドでは、Element プロパティを調べることで、SOAP ヘッダーによって渡されるデータと共に SOAP ヘッダーの名前を判断できます。

    public class MyWebService {
        public SoapUnknownHeader[] unknownHeaders;
    [Visual Basic]
    Public Class MyWebService
        Public unknownHeaders() As SoapUnknownHeader
    
  2. 不明な各 SOAP ヘッダーを処理する各 XML Web サービス メソッドに SoapHeader 属性を適用します。

        [WebMethod]
        [SoapHeader("unknownHeaders")]
        public string MyWebMethod()
    [Visual Basic]
        <WebMethod, _
         SoapHeader("unknownHeaders") > _
        Public Function MyWebMethod() As String
    
    
  3. 不明な SOAP ヘッダーを処理できるようにするかどうかを決定するコードを追加します。

    メンバ変数の型が SoapUnknownHeader である場合、XML Web サービス メソッドは、Element プロパティを調べることで、SOAP ヘッダーによって渡されるデータと共に SOAP ヘッダーの名前を判断できます。Element プロパティの Name プロパティによって、SOAP ヘッダーの名前が識別されます。

           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") Then
    
  4. 特定の SOAP ヘッダーの処理方法がわかっている場合には、不明な SOAP ヘッダーを表すメンバ変数の DidUnderstand プロパティを true に設定します。

    XML Web サービス メソッドが不明な SOAP ヘッダーを処理する場合に、DidUnderstand プロパティが true に設定されていないときには、SoapHeaderException がスローされます。詳細については、「XML Web サービス クライアントが必要とする SOAP ヘッダーの処理」を参照してください。

             // 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 If
    

    **メモ   **ASP.NET を使用して作成した XML Web サービスでは、DidUnderstand プロパティを使用して XML Web サービス メソッドと通信します。このプロパティは SOAP 仕様の一部ではありません。また、その値は SOAP 要求または SOAP 応答の一部としては含まれません。

    **メモ   **XML Web サービス クライアントが Web サービス記述言語ツール (Wsdl.exe) を使用してプロキシ クラスを作成し、該当の XML Web サービスが SOAP ヘッダーを表す SoapUnknownHeader 型のメンバ変数を定義している場合、その SOAP ヘッダーへの参照はプロキシ クラスには追加されません。XML Web サービス クライアントがその SOAP ヘッダーを SOAP 要求に追加する場合は、メンバ変数を追加し、適切な XML Web サービス メソッドを呼び出すメソッドに SoapHeader 属性を適用することによって、プロキシ クラスを変更する必要があります。

XML Web サービス クライアントが必要とする SOAP ヘッダーの処理

クライアントは、SOAP 要求を正常に処理するために、SOAP ヘッダーのセマンティクスを適切に解釈して処理するように XML Web サービス メソッドに対して要求できます。そのためには、クライアントが SOAP ヘッダーの mustUnderstand 属性を 1 に設定します。たとえば、次の SOAP 要求では、MyCustomSoapHeader SOAP ヘッダーを処理することを SOAP 要求の受信側に要求しています。

<?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>

XML Web サービスで SOAP ヘッダーが定義されているかどうかに応じて、クライアントによって要求される SOAP ヘッダーを XML Web サービスで処理する方法が決まります。XML Web サービスが SOAP ヘッダーを定義している場合には、多くの作業が ASP.NET によって処理されます。次の手順では、2 つの事例を処理する方法を示します。

XML Web サービスによって定義されていないが、XML Web サービス クライアントによって要求される SOAP ヘッダーを処理するには

  • XML Web サービス クライアントからの不明な SOAP ヘッダーを処理するための手順に従います。SOAP ヘッダーの DidUnderstand プロパティには特に注意してください。

    XML Web サービスによって定義されていない SOAP ヘッダーの場合、DidUnderstand の初期値は false になります。XML Web サービス メソッドから制御が返された後で、DidUnderstand プロパティが false に設定された SOAP ヘッダーを ASP.NET が検出した場合には、SoapHeaderException が自動的にスローされます。

XML Web サービス クライアントによって要求され、XML Web サービスによって定義されている SOAP ヘッダーを処理するには

  • ASP.NET を使用して作成した XML Web サービス内の SOAP ヘッダーを各 XML Web サービス メソッドで処理するための手順に従います。

    XML Web サービスによって定義され、SOAP ヘッダーを受け取る XML Web サービス メソッドで処理される SOAP ヘッダーの場合、ASP.NET では、その XML Web サービスが SOAP ヘッダーを認識し、DidUnderstand の初期値を true に設定することを前提とします。

下に示す MyWebService XML Web サービスは、MyHeader SOAP ヘッダーを定義し、MyWebMethod XML Web サービス メソッドの呼び出し時にこの SOAP ヘッダーも一緒に送信するように要求します。さらに、MyWebMethod によって不明な SOAP ヘッダーが処理されます。MyWebMethod によって処理できる SOAP ヘッダーの場合、DidUnderstandtrue に設定されます。

<%@ 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

**メモ   **ASP.NET では、DidUnderstand プロパティを使用して XML Web サービス メソッドと通信します。このプロパティは SOAP 仕様の一部には含まれていないため、その値は SOAP 要求または SOAP 応答の一部には含まれません。

XML Web サービスが SOAP ヘッダーを転送する場合、SOAP 仕様の規則 (特に Actor の値に関する規則) に従うことが非常に重要です。詳細については、W3C Web サイト (http://www.w3.org/TR/SOAP/) を参照してください。

SOAP ヘッダーの処理時に発生したエラーの処理

XML Web サービスでヘッダー処理に固有のエラーが検出されると、SoapHeaderException がスローされます。この例外クラスを使用すると、XML Web サービスで応答の書式を正確に設定できます。クライアントが .NET Framework を使用して作成されている場合、このクライアントは SoapHeaderException を受け取ります。InnerException プロパティなどの SoapHeaderException の内容は、Message プロパティに含まれています。クライアントによってキャッチされた SoapHeaderExceptionInnerException プロパティは、null になります。SOAP 仕様で規定されているように例外はネットワーク上では SOAP <Fault> XML 要素に含まれて送信されるため、これは .NET Framework でサポートされているプログラミング モデルです。例外の詳細については、「XML Web サービスでの例外の処理およびスロー」を参照してください。

次のコード例は、クライアントが XML Web サービス メソッド MyWebMethod に SOAP 要求を送信したとき、XML Web サービスが SOAP 要求を受け取った時刻と Expires プロパティに設定された日時とを比較して有効期限を過ぎていた場合に、SoapHeaderException をスローします。

<%@ 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

メモ .NET Framework バージョン 1.0 には SoapHeaderAttribute.Required プロパティが含まれており、このプロパティが true に設定されている場合は、XML Web サービスが、特定の SOAP ヘッダーを送信することをクライアントに要求できます。ASP.NET では、soap:header 要素の wsdl:required 属性を "true" に設定して、生成された WSDL ドキュメントに SOAP ヘッダーが必要であることを示します。WSDL ドキュメントから作成された XML Web サービスの .NET Framework クライアントが要求された SOAP ヘッダーを送信しない場合、このクライアントは SoapHeaderException を受け取り、他のクライアントは SOAP 違反を受け取ります。他の SOAP の実装と相互運用するために、この機能は将来のバージョンでは削除されます。

Required プロパティはバージョン 1.1 では使用されなくなり、WSDL ドキュメント内の soap:header 要素の wsdl:required 属性は Web サービス記述言語ツール (Wsdl.exe) では無視されます。SOAP ヘッダーは必須ではなくなる可能性があるので、XML Web サービスでは SOAP ヘッダーを表すフィールドやプロパティにアクセスする前に、そのフィールドやプロパティが null ではないことを確認する必要があります。

参照

SoapHeader クラス | SoapHeaderAttribute クラス | SoapHeaderException クラス | SoapUnknownHeader クラス | ASP.NET を使用した XML Web サービスの作成 | XML Web サービス クライアントの作成