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 ヘッダーを表すクラスを定義するには
SOAP ヘッダーのルート要素名と一致する名前のクラスを SoapHeader クラスから派生させます。
public class MyHeader : SoapHeader [Visual Basic] Public Class MyHeader : Inherits SoapHeader
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 ヘッダーを処理するには
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
SOAP ヘッダーを処理する各 XML Web サービス メソッドに SoapHeader 属性を適用します。SoapHeader 属性の MemberName プロパティとして、最初の手順で作成したメンバ変数の名前を設定します。
[WebMethod] [SoapHeader("timeStamp")] public void MyWebMethod() [Visual Basic] <WebMethod, SoapHeader("TimeStamp")> _ Public Sub MyWebMethod()
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 ヘッダーを処理するには
SOAP ヘッダーを表すクラスの新しいインスタンスを作成します。
Dim mySoapHeader As MyHeader = New MyHeader() [C#] MyHeader mySoapHeader = new MyHeader();
SOAP ヘッダーの値を設定します。
header.Expires = 60000 header.Created = DateTime.UtcNow [C#] header.Expires = 60000; header.Created = DateTime.UtcNow;
プロキシ クラスの新しいインスタンスを作成します。
Dim proxy As MyWebService = New MyWebService() [C#] MyWebService proxy = new MyWebService();
SOAP ヘッダー オブジェクトを、SOAP ヘッダーを表すプロキシ クラスのメンバ変数に割り当てます。
proxy.MyHeaderValue = mySoapHeader [C#] proxy.MyHeaderValue = mySoapHeader
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 プロパティには、In、Out、InOut、および Fault の 4 つの値があります。この 4 つの値は、受信側 (XML Web サービス サーバーかどうか)、クライアント、XML Web サービス サーバーとクライアントの両方、および XML Web サービスが例外をスローしたときに SOAP ヘッダーがクライアントに送信されるかどうかをそれぞれ表します。
メモ .NET Framework SDK バージョン 1.0 では、Fault 値はサポートされていません。
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 サービスを実装するクラスにメンバ変数を追加します。
[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
SOAP ヘッダーを処理する各 XML Web サービス メソッドに SoapHeader 属性を適用します。SoapHeaderDirection 列挙体を使用して、Direction プロパティの値として目的の各受信側を設定します。Direction を SoapHeaderDirection.Out に設定することで、受信側として XML Web サービス クライアントを設定するコード例を次に示します。
[WebMethod] [SoapHeader("myOutHeader",Direction=SoapHeaderDirection.Out)] [Visual Basic] <WebMethod, _ SoapHeader("myOutHeader",Direction:=SoapHeaderDirection.Out)>
受信側に応じて 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 ヘッダーを処理するには
XML Web サービスを実装するクラスに、複数の不明な SOAP ヘッダーを処理するために、SoapUnknownHeader 型または SoapHeader 型、あるいはそのいずれかの配列であるメンバ変数を追加します。
この型を SoapUnknownHeader の配列または単一のインスタンスとして宣言すると、SoapUnknownHeader に Element プロパティを含めることができます。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
不明な各 SOAP ヘッダーを処理する各 XML Web サービス メソッドに SoapHeader 属性を適用します。
[WebMethod] [SoapHeader("unknownHeaders")] public string MyWebMethod() [Visual Basic] <WebMethod, _ SoapHeader("unknownHeaders") > _ Public Function MyWebMethod() As String
不明な 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
特定の 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 ヘッダーの場合、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";
}
}
[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 プロパティに含まれています。クライアントによってキャッチされた SoapHeaderException の InnerException プロパティは、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 サービス クライアントの作成