次の方法で共有


FaultContractAttribute クラス

定義

サービス操作で処理エラーが発生したときに返される 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
属性

次のコード例は、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 、エラー メッセージでシリアル化された詳細オブジェクトの型を取得します。

  • プロパティとNamespaceプロパティはName、それぞれエラー メッセージの名前と名前空間を制御します。

  • エラー HasProtectionLevel メッセージに保護レベルが指定されているかどうかを示します。その場合、 ProtectionLevel プロパティはそのレベルの保護を制御します。

注意事項

エラー メッセージに機密性の高い情報やセキュリティ上の問題が発生する可能性がある情報が含まれる場合は、プロパティを ProtectionLevel 設定することを強くお勧めします。

  • 明示的にいずれかに設定したProtectionLevel場合、バインディングのプロパティを使用してセキュリティが有効になっているバインドを使用System.ServiceModel.SecurityModeする必要があります。または、例外がスローされます。ProtectionLevel.EncryptAndSignProtectionLevel.Sign

  • セキュリティを有効にしたバインドを選択し、コントラクト上のどこにも ProtectionLevel プロパティを設定しない場合は、すべてのアプリケーション データが暗号化および署名されます。

  • セキュリティが有効になっていないバインド (既定ではセキュリティが無効になっているなど) を選択しProtectionLevelSystem.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プロパティNameProtectionLevel設定しません。

[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.IServiceBehaviorSystem.ServiceModel.Dispatcher.IErrorHandler実装するか、プロパティSystem.ServiceModel.Description.IEndpointBehaviorChannelDispatcher.ErrorHandlers割り当てます。 IErrorHandler を使用すると、生成される SOAP エラーと、それをクライアントに返すかどうかを明示的に制御できます。

デバッグを容易にするには、in コードにServiceBehaviorAttribute.IncludeExceptionDetailInFaultstrue設定するか、アプリケーション構成ファイルで使用ServiceDebugBehavior.IncludeExceptionDetailInFaultsできます。 有効な場合は、サービスが自動的に例外情報を呼び出し元に返します。 これらのエラーは、例外として FaultException クライアントに表示されます。

重要

マネージド例外によって内部アプリケーション情報が公開されるおそれがあるため、ServiceBehaviorAttribute.IncludeExceptionDetailInFaults または ServiceDebugBehavior.IncludeExceptionDetailInFaultstrue に設定すると、個人の身元を確認できる情報またはその他の機密情報を含む内部サービス操作例外に関する情報を WCF クライアントで取得できるようになります。

したがって、ServiceBehaviorAttribute.IncludeExceptionDetailInFaults または ServiceDebugBehavior.IncludeExceptionDetailInFaultstrue に設定することは、サービス アプリケーションを一時的にデバッグする方法としてのみお勧めできます。 さらに、このようにして未処理のマネージド例外を返すメソッドの 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)

適用対象