2011-01-28 8 views
3

私は銀河クライアントコードで一度も捕まえようとしている例外をスローするWCFサービスを持っています。私はデバッグ目的で宣言されていない障害を使用していますが、これは私のサービスメソッドです:silverlightクライアントはfaultexceptionを理解しません

private void MyServiceCallback(MyWCFServiceMethodCompletedEventArgs e) 
{ 
    if (e.Error == null) 
    { 
     //proceed normally 
    } 
    else if (e.Error is FaultException) 
    { 
     FaultException<ExceptionDetail> fault = e.Error as FaultException<ExceptionDetail>; 
     MessageBox.Show(fault.Detail.Message); 
     MessageBox.Show(fault.Reason.ToString()); 
    } 
} 

[OperationContract] 
public ServiceResponse MyWCFServiceMethod() 
{ 
    ServiceResponse resp = new ServiceResponse(); 
    //code for setting resp... 

    //purposely throw error here. 
    throw new FaultException(new FaultReason(new FaultReasonText("My fault Reason!")),new FaultCode("my fault code here")); 
    return resp; 
} 

今私のSilverlightのクライアントビューモデルでは、サービスのコールバックメソッドでは、私はこのようにそれを処理しようとします私はまだSystem.Net.WebException得るこの行else if (e.Error is FaultException)

{リモートサーバーがエラー返さ:NOTFOUNDを}

これらは設定項目

012であります

これは、このサービスは同じシルバーソリューション内の別のプロジェクトであるサービスクラス宣言

[ServiceContract(Namespace = "")] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class MySilverlightWCFService 
{ 
.... 

です。 なぜ私のSilverlightクライアントは私が投げているフォルト例外を得ることができませんか?お時間を

おかげで...

答えて

2

サーバーはおそらくSilverlightが無視されるHTTP 500応答コードを投げています。 Silverlightが受け入れるHTTPコードを返すようにサービスを変更する必要があります。 Data Performance and Fault Strategies in Silverlight 3から

:(。この記事は、どのようにSilverlightのにWCFの障害を返すことを示します)

Infamous NotFound Error: When the exception is raised, an HTTP status code of 500 is returned to Silverlight. The browser networking stack prevents Silverlight from reading responses with a status code of 500, so any SOAP fault information contained within is unavailable to the Silverlight client application. Even if the message could be retrieved, Silverlight 2 is not capable of converting the fault back into a managed exception. Both of these issues have been addressed in Silverlight 3.

+0

Silverlightはサービスエラー処理を考慮して設計されていますか? :O – user20358

+0

ステータスコードを500からSilverlightが読み取れるものに変更する必要があるようです。サービス側でも同様です。それで私がコントロールできないサービスがあれば?私はそれが不自然な回避策だと思う。私は何かを逃したかどうかを見るためにこれをもう一度読むつもり! – user20358

+0

私は、宣言されていないフォルトを処理するための記事で言及されていることを正確に行っています。それでも同じエラーが発生します: 'System.Net.WebException'。 – user20358

7

okがとてもようやくこの作品を作るための方法であると思われるものを1行のコードを追加取得することです障害の例外をスローする直前のサービスに!

System.ServiceModel.Web.WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK; 

そして、実際の例外をスロー:その後、Silverlightで私はに上記の私の質問に入れて何からセクションを扱うサービスコールバックのエラーを修正

throw new FaultException(new FaultReason(new FaultReasonText("My fault Reason!")),new FaultCode("my fault code here")); 

を:

//else if (e.Error is FaultException) 
    else 
    { 
     //FaultException<ExceptionDetail> fault = e.Error as FaultException<ExceptionDetail>; 
     //MessageBox.Show(fault.Detail.Message); 
     FaultException fault = e.Error as FaultException; 
     MessageBox.Show(fault.Reason.ToString()); 
    } 

働い私のために。醜い方法!

私は時間を取ったときに宣言されたフォールトを試してみます。

+0

これは実際の解決策です。デイブの返信は私に手伝ってくれたので、私は彼の返事を信じていた。 – user20358

+0

こんにちは、私はあなたの質問を見つけて、あなたの解決策が魔法のように働くまで私の頭を壁で叩いていました!この行が何をしているのか説明していただけますか? 'System.ServiceModel.Web。WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK; ' –

関連する問題