FaultContractAttribute クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
サービス操作で処理エラーが発生したときに返される 1 つ以上の SOAP エラーを指定します。
public ref class FaultContractAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple=true, Inherited=false)]
public sealed class FaultContractAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple=true, Inherited=false)>]
type FaultContractAttribute = class
inherit Attribute
Public NotInheritable Class FaultContractAttribute
Inherits Attribute
- 継承
- 属性
例
次のコード例は、FaultContractAttribute 操作で SampleMethod
の詳細な型と共に SOAP エラーを返すことができることを指定するために、GreetingFault
を使用しています。
using System;
using System.Collections.Generic;
using System.Net.Security;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace Microsoft.WCF.Documentation
{
[ServiceContract(Namespace="http://microsoft.wcf.documentation")]
public interface ISampleService{
[OperationContract]
[FaultContractAttribute(
typeof(GreetingFault),
Action="http://www.contoso.com/GreetingFault",
ProtectionLevel=ProtectionLevel.EncryptAndSign
)]
string SampleMethod(string msg);
}
[DataContractAttribute]
public class GreetingFault
{
private string report;
public GreetingFault(string message)
{
this.report = message;
}
[DataMemberAttribute]
public string Message
{
get { return this.report; }
set { this.report = value; }
}
}
class SampleService : ISampleService
{
#region ISampleService Members
public string SampleMethod(string msg)
{
Console.WriteLine("Client said: " + msg);
// Generate intermittent error behavior.
Random rnd = new Random(DateTime.Now.Millisecond);
int test = rnd.Next(5);
if (test % 2 != 0)
return "The service greets you: " + msg;
else
throw new FaultException<GreetingFault>(new GreetingFault("A Greeting error occurred. You said: " + msg));
}
#endregion
}
}
Imports System.Collections.Generic
Imports System.Net.Security
Imports System.Runtime.Serialization
Imports System.ServiceModel
Imports System.Text
Namespace Microsoft.WCF.Documentation
<ServiceContract(Namespace:="http://microsoft.wcf.documentation")> _
Public Interface ISampleService
<OperationContract, FaultContractAttribute(GetType(GreetingFault), Action:="http://www.contoso.com/GreetingFault", ProtectionLevel:=ProtectionLevel.EncryptAndSign)> _
Function SampleMethod(ByVal msg As String) As String
End Interface
<DataContractAttribute> _
Public Class GreetingFault
Private report As String
Public Sub New(ByVal message As String)
Me.report = message
End Sub
<DataMemberAttribute> _
Public Property Message() As String
Get
Return Me.report
End Get
Set(ByVal value As String)
Me.report = value
End Set
End Property
End Class
Friend Class SampleService
Implements ISampleService
#Region "ISampleService Members"
Public Function SampleMethod(ByVal msg As String) As String Implements ISampleService.SampleMethod
Console.WriteLine("Client said: " & msg)
' Generate intermittent error behavior.
Dim rand As New Random(DateTime.Now.Millisecond)
Dim test As Integer = rand.Next(5)
If test Mod 2 <> 0 Then
Return "The service greets you: " & msg
Else
Throw New FaultException(Of GreetingFault)(New GreetingFault("A Greeting error occurred. You said: " & msg))
End If
End Function
#End Region
End Class
End Namespace
次のコード例は、WCF クライアントでISampleService
この SOAP エラーが種類GreetingFault
としてFaultException<TDetail>発生することを示しています。
using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using Microsoft.WCF.Documentation;
public class Client
{
public static void Main()
{
// Picks up configuration from the config file.
SampleServiceClient wcfClient = new SampleServiceClient();
try
{
// Making calls.
Console.WriteLine("Enter the greeting to send: ");
string greeting = Console.ReadLine();
Console.WriteLine("The service responded: " + wcfClient.SampleMethod(greeting));
Console.WriteLine("Press ENTER to exit:");
Console.ReadLine();
// Done with service.
wcfClient.Close();
Console.WriteLine("Done!");
}
catch (TimeoutException timeProblem)
{
Console.WriteLine("The service operation timed out. " + timeProblem.Message);
Console.ReadLine();
wcfClient.Abort();
}
catch (FaultException<GreetingFault> greetingFault)
{
Console.WriteLine(greetingFault.Detail.Message);
Console.ReadLine();
wcfClient.Abort();
}
catch (FaultException unknownFault)
{
Console.WriteLine("An unknown exception was received. " + unknownFault.Message);
Console.ReadLine();
wcfClient.Abort();
}
catch (CommunicationException commProblem)
{
Console.WriteLine("There was a communication problem. " + commProblem.Message + commProblem.StackTrace);
Console.ReadLine();
wcfClient.Abort();
}
}
}
Imports System.ServiceModel
Imports System.ServiceModel.Channels
Imports Microsoft.WCF.Documentation
Public Class Client
Public Shared Sub Main()
' Picks up configuration from the config file.
Dim wcfClient As New SampleServiceClient()
Try
' Making calls.
Console.WriteLine("Enter the greeting to send: ")
Dim greeting As String = Console.ReadLine()
Console.WriteLine("The service responded: " & wcfClient.SampleMethod(greeting))
Console.WriteLine("Press ENTER to exit:")
Console.ReadLine()
' Done with service.
wcfClient.Close()
Console.WriteLine("Done!")
Catch timeProblem As TimeoutException
Console.WriteLine("The service operation timed out. " & timeProblem.Message)
Console.ReadLine()
wcfClient.Abort()
Catch greetingFault As FaultException(Of GreetingFault)
Console.WriteLine(greetingFault.Detail.Message)
Console.ReadLine()
wcfClient.Abort()
Catch unknownFault As FaultException
Console.WriteLine("An unknown exception was received. " & unknownFault.Message)
Console.ReadLine()
wcfClient.Abort()
Catch commProblem As CommunicationException
Console.WriteLine("There was a communication problem. " & commProblem.Message + commProblem.StackTrace)
Console.ReadLine()
wcfClient.Abort()
End Try
End Sub
End Class
注釈
操作に属性を FaultContractAttribute 付けて、サービス操作の Web サービス記述言語 (WSDL) 記述に追加された 1 つ以上の特定の例外条件を、操作によって返される明示的な SOAP エラー メッセージとして宣言します。
すべてのマネージド アプリケーションで、操作エラーは Exception オブジェクトにより表されます。 Windows Communication Foundation (WCF) アプリケーションなどの SOAP ベースのアプリケーションでは、サービス メソッドは SOAP エラー メッセージを使用して処理エラー情報を通信します。 WCF アプリケーションは両方の種類のエラー システムで実行されるため、クライアントに送信する必要があるマネージド例外情報は、例外から SOAP エラーに変換する必要があります。 既定のサービス例外動作を使用できます。または、例外をエラー メッセージにマッピングするかどうかとそのマッピング方法を明示的に制御できます。 WCF アプリケーションでの例外と SOAP エラーの概要については、「 コントラクトとサービスでのエラーの指定と処理」を参照してください。
サービス操作では、通常の FaultContractAttribute 操作の過程でクライアントが受け取る可能性があるすべての SOAP エラーを正式に指定するために使用することをお勧めします。 また、SOAP エラーでは、情報の開示を最小限に抑えるために、クライアントが知る必要がある情報だけを返すことをお勧めします。
このプロパティは Action 、エラー メッセージのアクションを制御します。
このプロパティは DetailType 、エラー メッセージでシリアル化された詳細オブジェクトの型を取得します。
エラー HasProtectionLevel メッセージに保護レベルが指定されているかどうかを示します。その場合、 ProtectionLevel プロパティはそのレベルの保護を制御します。
注意事項
エラー メッセージに機密性の高い情報やセキュリティ上の問題が発生する可能性がある情報が含まれる場合は、プロパティを ProtectionLevel 設定することを強くお勧めします。
明示的にいずれかに設定したProtectionLevel場合、バインディングのプロパティを使用してセキュリティが有効になっているバインドを使用System.ServiceModel.SecurityModeする必要があります。または、例外がスローされます。ProtectionLevel.EncryptAndSignProtectionLevel.Sign
セキュリティを有効にしたバインドを選択し、コントラクト上のどこにも ProtectionLevel プロパティを設定しない場合は、すべてのアプリケーション データが暗号化および署名されます。
セキュリティが有効になっていないバインド (既定ではセキュリティが無効になっているなど) を選択しProtectionLevel、System.ServiceModel.BasicHttpBinding明示的に設定されていない場合、アプリケーション データは保護されません。
多くのシナリオでは、エラー メッセージのEncryptAndSign設定ProtectionLevelで十分です。 詳細については、「 保護レベルについて」を参照してください。
指定された FaultContractAttribute操作から指定したエラーを返すには、操作中にマネージド例外が発生したときに (型パラメーターがシリアル化可能なエラー情報である) をスロー FaultException<TDetail> します。 WCF クライアント アプリケーションは、SOAP エラーをクライアント実装でスローされたのと同じ型 (つまり、型パラメーターがシリアル化可能なエラー情報) として FaultException<TDetail> 表示されます。 これは FaultContractAttribute 、双方向サービス操作と非同期操作ペアの SOAP エラーを指定する場合にのみ使用できます。一方向操作では SOAP エラーがサポートされていないため、サポート FaultContractAttributeされません。
注意
エラー情報を伝えるために、任意のシリアル化可能な型を使用できます。 このバージョンの WCF の唯一の制限は、で指定された FaultContractAttribute 型をシリアル化可能 System.Runtime.Serialization.DataContractSerializerにする必要があるということです。 シリアル化のサポート DataContractSerializer については、「 データ コントラクト シリアライザー」を参照してください。
たとえば、クライアントが、その型パラメーターを含む SOAP エラーを Int32on サービス メソッドに FaultContractAttribute 配置できることを指定します。
注意
次のコード例では、プロパティ 、またはNamespaceプロパティNameをProtectionLevel設定しません。
[OperationContractAttribute]
[FaultContractAttribute(typeof(int))]
int Divide(int arg1, int arg2);
<OperationContractAttribute(), FaultContractAttribute(GetType(Integer))> _
Function Divide(ByVal arg1 As Integer, ByVal arg2 As Integer) As Integer
End Interface 'FCADemonstration
次に、サービス メソッドで、エラー情報を含む型 (上記の場合は a) の型である新しい FaultException<TDetail> 型パラメーターを Int32スローします。 次に例を示します。
throw new FaultException<int>(4);
Throw New FaultException(Of Integer)(4)
上記の例は非常に基本的です。ほとんどの情報はコードを System.Int32 使用して渡すことができるので、この詳細の種類は最も役に立ちません。 通常、WCF アプリケーションでは、クライアントのエラー情報要件に固有の詳細の種類を持つ SOAP エラーを指定します。 より完全な例については、「使用例」のセクションを参照してください。
注意
型パラメーターSystem.Stringを指定FaultException<TDetail>すると、クライアント アプリケーションの Detail プロパティに文字列値が割り当てられます。クライアントは、メソッドを呼び出してその文字列をFaultException<TDetail>.ToString取得できません。 クライアント アプリケーションが Exception.ToString を呼び出したときにこの文字列値を返すには、操作内で System.ServiceModel.FaultException 例外をスローし、この文字列をコンストラクターに渡します。
例外がスローされたときのFaultException<TDetail>アプリケーションの動作を明示的に制御するには、インターフェイス System.ServiceModel.Description.IContractBehavior System.ServiceModel.Description.IServiceBehaviorをSystem.ServiceModel.Dispatcher.IErrorHandler実装するか、プロパティSystem.ServiceModel.Description.IEndpointBehaviorにChannelDispatcher.ErrorHandlers割り当てます。 IErrorHandler を使用すると、生成される SOAP エラーと、それをクライアントに返すかどうかを明示的に制御できます。
デバッグを容易にするには、in コードにServiceBehaviorAttribute.IncludeExceptionDetailInFaultstrue
設定するか、アプリケーション構成ファイルで使用ServiceDebugBehavior.IncludeExceptionDetailInFaultsできます。 有効な場合は、サービスが自動的に例外情報を呼び出し元に返します。 これらのエラーは、例外として FaultException クライアントに表示されます。
重要
マネージド例外によって内部アプリケーション情報が公開されるおそれがあるため、ServiceBehaviorAttribute.IncludeExceptionDetailInFaults または ServiceDebugBehavior.IncludeExceptionDetailInFaults を true
に設定すると、個人の身元を確認できる情報またはその他の機密情報を含む内部サービス操作例外に関する情報を WCF クライアントで取得できるようになります。
したがって、ServiceBehaviorAttribute.IncludeExceptionDetailInFaults または ServiceDebugBehavior.IncludeExceptionDetailInFaults を true
に設定することは、サービス アプリケーションを一時的にデバッグする方法としてのみお勧めできます。 さらに、このようにして未処理のマネージド例外を返すメソッドの WSDL には、FaultException<TDetail> 型の String のコントラクトが含まれません。 クライアントは、デバッグ情報を適切に取得するために、(System.ServiceModel.FaultException オブジェクトとして WCF クライアントに返される) 不明な SOAP エラーの可能性について想定しておく必要があります。
コンストラクター
FaultContractAttribute(Type) |
FaultContractAttribute クラスの新しいインスタンスを初期化します。 |
プロパティ
Action |
操作コントラクトの一部として指定された SOAP エラー メッセージのアクションを取得または設定します。 |
DetailType |
エラー情報を含むシリアル化可能なオブジェクトの型を取得します。 |
HasProtectionLevel |
SOAP エラー メッセージに保護レベルが割り当てられているかどうかを示す値を取得します。 |
Name |
Web サービス記述言語 (WSDL) でのエラー メッセージの名前を取得または設定します。 |
Namespace |
SOAP エラーの名前空間を取得または設定します。 |
ProtectionLevel |
SOAP エラーがバインドに要求する保護レベルを指定します。 |
TypeId |
派生クラスで実装されると、この Attribute の一意の識別子を取得します。 (継承元 Attribute) |
メソッド
Equals(Object) |
このインスタンスが、指定されたオブジェクトと等価であるかどうかを示す値を返します。 (継承元 Attribute) |
GetHashCode() |
このインスタンスのハッシュ コードを返します。 (継承元 Attribute) |
GetType() |
現在のインスタンスの Type を取得します。 (継承元 Object) |
IsDefaultAttribute() |
派生クラスでオーバーライドされるとき、このインスタンスの値が派生クラスの既定値であるかどうかを示します。 (継承元 Attribute) |
Match(Object) |
派生クラス内でオーバーライドされたときに、指定したオブジェクトとこのインスタンスが等しいかどうかを示す値を返します。 (継承元 Attribute) |
MemberwiseClone() |
現在の Object の簡易コピーを作成します。 (継承元 Object) |
ToString() |
現在のオブジェクトを表す文字列を返します。 (継承元 Object) |
明示的なインターフェイスの実装
_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) |
一連の名前を対応する一連のディスパッチ識別子に割り当てます。 (継承元 Attribute) |
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) |
オブジェクトの型情報を取得します。この情報はインターフェイスの型情報の取得に使用できます。 (継承元 Attribute) |
_Attribute.GetTypeInfoCount(UInt32) |
オブジェクトが提供する型情報インターフェイスの数 (0 または 1) を取得します。 (継承元 Attribute) |
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) |
オブジェクトによって公開されたプロパティおよびメソッドへのアクセスを提供します。 (継承元 Attribute) |