3

Silverlightクライアントコードで正常にキャッチしようとしていない例外をスローするWCFサービスがあります。デバッグの目的で宣言されていない障害を使用しています。これが私のサービス方法です。

[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クライアントビューモデルでは、サービスのコールバックメソッドで、次のように処理しようとしています。

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());
   }
} 

この行else if (e.Error is FaultException) では、まだSystem.Net.WebExceptionが発生します{リモートサーバーがエラーを返しました:NotFound。}

これらは構成エントリです

<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />

これはサービスクラス宣言です

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

このサービスは、同じSilverlightソリューション内の別のプロジェクトにあります。Silverlightクライアントがスローしている障害例外を取得できないのはなぜですか?

御時間ありがとうございます...

4

3 に答える 3

7

最後に、これを機能させる方法のように思われるのは、障害例外をスローする直前にサービスに1行のコードを追加することです!

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

次に、実際の例外をスローします。

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

次に、Silverlight で、サービス コールバックのエラー処理セクションを、上記の質問に記載した内容から次のように変更します。

   //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());
   }

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

時間ができたら、Declared faults で試してみます。

于 2011-01-30T11:44:46.833 に答える
3

SilverlightFaultBehaviorをチェックしてください。ステータスコードの変更を処理します。

于 2012-03-01T14:15:33.657 に答える
2

サーバーは、Silverlight が無視する HTTP 500 応答コードをスローしている可能性があります。Silverlight が受け入れる HTTP コードを返すようにサービスを変更する必要があります。

Silverlight 3 の Data Performance and Fault Strategiesから: (この記事では、WCF のエラーを Silverlight に返す方法を示します。)

悪名高い NotFound エラー: 例外が発生すると、HTTP ステータス コード 500 が Silverlight に返されます。ブラウザーのネットワーク スタックは、Silverlight がステータス コード 500 の応答を読み取れないようにするため、Silverlight クライアント アプリケーションは含まれる SOAP エラー情報を利用できません。メッセージを取得できたとしても、Silverlight 2 はフォールトをマネージ例外に戻すことができません。これらの問題は両方とも、Silverlight 3 で対処されています。

于 2011-01-28T18:30:46.933 に答える