SilverlightアプリケーションでWebサービスコール中にエラーが起きた場合、AsyncCompletedEventArgsのErrorプロパティにExceptionがセットされます。Errorの内容によって応じた適切な処理を行う必要があります。
アジェンダ
- エラー時のResultプロパティの挙動
- ErrorプロパティにセットされるExceptionの種類
- Errorプロパティの処理
エラー時のResultプロパティの挙動
Errorプロパティに値がセットされている時に、Resultプロパティにアクセスすると、例外が発生します。
そのため、Errorプロパティに値がセットされているときは処理を分岐させることが必須です。
ErrorプロパティにセットされるExceptionの種類
Errorプロパティには、だいたい下記のようなExceptionがセットされるはずです。
Exceptionの種類 | 発生理由 |
---|---|
CommunicationException | サーバが落ちている、LANケーブルが抜けているなどの理由でサーバが見つからなかったとき |
TimeoutException | サーバへのアクセスは成功したが、サーバからタイムアウト設定時間以内に返答がなかったとき |
Exception | サーバ内で処理されないExcpetionが発生したなどの不測の事態が起きたとき |
Errorプロパティの処理
Exceptionの種類に応じたメッセージを表示する処理をWebサービスのコンプリートメソッドに記述します。
private void Client_GetMessageCompleted(object sender, GetMessageCompletedEventArgs e) { Exception error = e.Error; if (error == null) { // 正常処理 string result = e.Result; TblResult.Text = result; } else if (error is CommunicationException) { string errorMessage = "サーバーとの通信中に問題が発生しました。" + Environment.NewLine + "しばらく待ったのち再度実行してください。"; MessageBox.Show(errorMessage, "通信障害", MessageBoxButton.OK); } else if (error is TimeoutException) { string errorMessage = "通信がタイムアウトしました。" + Environment.NewLine + "しばらく待ったのち再度実行してください。"; MessageBox.Show(errorMessage, "通信障害", MessageBoxButton.OK); } else { string errorMessage = "サーバーとの通信が失敗しました。" + Environment.NewLine + "システム管理者に連絡してください。"; MessageBox.Show(errorMessage, "通信障害", MessageBoxButton.OK); } }
これでError発生時にユーザは何が起きたのか把握することができると思います。
今回の処理はあくまで例ですが、必ずErrorの処理は行うようにしましょう。