54

特定の状況に基づいてカスタム障害をスローするために、WCFサービスに次のコードがあります。「この障害の作成者が理由を指定しませんでした」という例外が発生します。私は何が間違っているのですか?

//source code
if(!DidItPass)
{
    InvalidRoutingCodeFault fault = new InvalidRoutingCodeFault("Invalid Routing Code - No Approval Started");
    throw new FaultException<InvalidRoutingCodeFault>(fault);
}

//operation contract
[OperationContract]
[FaultContract(typeof(InvalidRoutingCodeFault))]
bool MyMethod();

//data contract
[DataContract(Namespace="http://myuri.org/Simple")]
public class InvalidRoutingCodeFault
{
    private string m_ErrorMessage = string.Empty;

    public InvalidRoutingCodeFault(string message)
    {
        this.m_ErrorMessage = message;
    }

    [DataMember]
    public string ErrorMessage
    {
        get { return this.m_ErrorMessage; }
        set { this.m_ErrorMessage = value; }
    }
}
4

10 に答える 10

49

いくつかの追加調査の後、次の変更されたコードが機能しました。

if(!DidItPass)
{    
    InvalidRoutingCodeFault fault = new InvalidRoutingCodeFault("Invalid Routing Code - No Approval Started");    
    throw new FaultException<InvalidRoutingCodeFault>(fault, new FaultReason("Invalid Routing Code - No Approval Started"));
}
于 2008-12-04T19:07:09.673 に答える
18

簡単な答えは、結果を間違って読んでいるだけで、何も悪いことをしていないということです。

クライアント側でエラーをキャッチすると、キャッチされるのはタイプSystem.ServiceModel.FaultException<InvalidRoutingCodeFault>です。オブジェクトは実際にはFaultExceptionの
プロパティにあります。それで....InvalidRoutingCodeFault.detail

//クライアントコード

private static void InvokeMyMethod() 
{ 
    ServiceClient service = new MyService.ServiceClient(); 

    try 
    { 
        service.MyMethod(); 
    } 
    catch (System.ServiceModel.FaultException<InvalidRoutingCodeFault> ex) 
    { 
        // This will output the "Message" property of the System.ServiceModel.FaultException
        // 'The creator of this fault did not specify a Reason' if not specified when thrown
        Console.WriteLine("faultException Message: " + ex.Message);    
        // This will output the ErrorMessage property of your InvalidRoutingCodeFault type
        Console.WriteLine("InvalidRoutingCodeFault Message: " + ex.Detail.ErrorMessage);    
    } 
}

FaultExceptionのMessageプロパティはエラーページに表示されるものであるため、John Egertonの投稿のように入力されていない場合は、「この障害の作成者が理由を指定しませんでした」というメッセージが表示されます。簡単にデータを設定するには、次のようにサービスで障害をスローするときに2つのパラメーターコンストラクターを使用して、障害タイプからエラーメッセージを渡します。

InvalidRoutingCodeFault fault = new InvalidRoutingCodeFault("Invalid Routing Code - No Approval Started");                                          
throw new FaultException<InvalidRoutingCodeFault>(fault, new FaultReason(fault.ErrorMessage));                                      
于 2012-09-10T20:12:35.923 に答える
9
serviceDebug includeExceptionDetailInFaults="true"

解決策ではありません

次のコードはserviceDebug includeExceptionDetailInFaults="false"

// data contract 

[DataContract]
public class FormatFault
{
    private string additionalDetails;

    [DataMember]
    public string AdditionalDetails
    {
        get { return additionalDetails; }
        set { additionalDetails = value; }
    }
}

// interface method declaration

    [OperationContract]
    [FaultContract(typeof(FormatFault))]
    void DoWork2();

// service method implementation

    public void DoWork2()
    {
        try
        {
            int i = int.Parse("Abcd");
        }
        catch (FormatException ex)
        {
            FormatFault fault = new FormatFault();
            fault.AdditionalDetails = ex.Message;
            throw new FaultException<FormatFault>(fault);
        }
    }

// client calling code

    private static void InvokeWCF2()
    {
        ServiceClient service = new ServiceClient();

        try
        {
            service.DoWork2();
        }
        catch (FaultException<FormatFault> e)
        {
            // This is a strongly typed try catch instead of the weakly typed where we need to do -- if (e.Code.Name == "Format_Error")
            Console.WriteLine("Handling format exception: " + e.Detail.AdditionalDetails);   
        }
    }

必要ない場合は、障害理由を追加する必要はありません。FaultContract 属性が正しいことを確認してください

于 2009-01-28T11:33:46.990 に答える
5

2 パラメーター コンストラクターを使用してこの問題を解決しました。

// service method implementation

 throw new FaultException<FormatFault>(fault,new FaultReason(fault.CustomFaultMassage)); 

CustomFaultMassage はデータ コントラクトのプロパティです。

于 2010-07-08T09:17:47.723 に答える
2

メソッドの FaultContract(typeof(className)) 属性を指定しない場合にも、この例外が発生する可能性があります。

于 2009-01-28T11:21:37.373 に答える
2

このような例外の通知を受け取りたくない場合は、[デバッグ] -> [例外] に移動し、[共通言語ランタイム例外] または特定の例外の [ユーザーが処理しない] のチェックを外します。

于 2010-04-14T09:39:11.820 に答える
1

Rashmiとまったく同じコードがあり、「この障害の作成者....」エラーが発生しました。VS2010でデバッグしているときに発生していました。私はこの投稿を見つけました:

http://sergecalderara.wordpress.com/2008/11/25/systemservicemodelfaultexception1-was-unhandled-by-user-code/

これは、オフにする必要のあるいくつかのデバッグオプションを説明しています。問題が解決しました。

于 2009-11-18T00:56:41.877 に答える
0

サーバー構成でこれを試すことができます (動作 -> serviceBehaviors -> 動作):

<serviceDebug includeExceptionDetailInFaults="true" />
于 2008-12-04T18:12:34.667 に答える
0

強く型付けされた try catch を使用することで、「この障害の作成者は理由を指定しませんでした」というエラーを回避できました。

于 2009-04-15T00:43:55.977 に答える
0

クライアントでサービス参照を更新すると、問題が解決しました。同じことがあなたのために働くことができます。

于 2010-09-21T22:50:45.627 に答える