クライアント側でサーバー例外を表示する機能を追加したいとします。Silverlightクライアントでサーバー例外を表示
サーバは、いくつかの例外を得た場合=>私は、例外メッセージが表示されます、クライアント側でいくつかのメッセージボックスを表示したい。..
私はそれをどのように行うことができますか?
クライアント側でサーバー例外を表示する機能を追加したいとします。Silverlightクライアントでサーバー例外を表示
サーバは、いくつかの例外を得た場合=>私は、例外メッセージが表示されます、クライアント側でいくつかのメッセージボックスを表示したい。..
私はそれをどのように行うことができますか?
まず、詳細なエラー情報を返すには、WCFサービスを有効にする必要があります。セキュリティ上の理由から、デフォルトではオフになっています(エラーメッセージでシステムの詳細を攻撃者に伝えたくない...)
そのためには、新しい<ServiceDebug>
行動とのサービスの振る舞い:
<behaviors>
<serviceBehaviors>
<behavior name="ServiceWithDetailedErrors">
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
第二に、あなたはこの新しいサービスの動作を参照するために、あなたの<service>
タグを変更する必要があります。
<service name="YourNamespace.YourServiceClassName"
behaviorConfiguration="ServiceWithDetailedErrors">
......
</service>
そして第三に:あなたはを見てあなたのSLソリューションを適応させる必要がありますエラーの詳細あなたは今戻ってきています。
最後に、この設定は開発やテストに非常に便利ですが、はにする必要があります。
Marcに言及したことに加えて、恐ろしい一般的な「見つからない」エラーを避けるために、HTTPクライアントスタックに切り替えることも必要です。
bool registerResult = WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);
あなたが障害契約を使用することができ、クライアントにエラーを渡している場合:
は、あなたのサービス契約にこの属性を追加します。
[OperationContract]
[FaultContract(typeof(MyCustomException))]
void MyServiceMethod();
は含む「MyCustomException」のクラスを作成します。クライアントに渡す情報(この場合、exception.ToString()からの例外の完全な詳細)。
その後、あなたのサービスメソッドの実装では、コードの周りのtry/catchを追加します。クライアント側で
public void MyServiceMethod()
{
try
{
// Your code here
}
catch(Exception e)
{
MyCustomException exception= new MyCustomException(e.ToString());
throw new FaultException<MyCustomException>(exception);
}
}
をあなたはのtry/catch(FaultExceptionのe)を入れて、あなたが好きしかし、詳細情報を表示することができます。
try
{
// your call here
}
catch (FaultException<MyCustomException> faultException)
{
// general message displayed to user here
MessageBox.Show((faultException.Detail as MyCustomException).Details);
}
catch (Exception)
{
// display generic message to the user here
MessageBox.Show("There was a problem connecting to the server");
}