2016-08-16 7 views
1

私のWebAPIコントローラには、正しい結果またはHttpResponseExceptionを返す関数があります。AngularJSサービスでHttpResponseExceptionを捕まえるには?

public async Task<SearchResult> Search([FromUri] SearchArguments args) 
    { 
     try 
     { 
      SearchResult searchResult = await _case.Search(args, true); 

      string validationError = searchResult.Error; 

      if (!string.IsNullOrEmpty(validationError)) 
      { 
       throw new HttpResponseException(new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest) 
       { 
        ReasonPhrase = string.Format("Could not find the case. {0}", validationError) 
       }); 
      } 

      return searchResult; 
     } 
     catch (Exception ex) 
     { 
      throw new HttpResponseException(new HttpResponseMessage(System.Net.HttpStatusCode.InternalServerError) 
      { 
       ReasonPhrase = ex.Message 
      }); 
     } 
    } 

anglejsサービスでは、以下のようにhttp get要求を使用してこの関数を呼び出します。

svc.Search = function (searchArgs) { 
     var deferred = $q.defer(); 
     var url = 'sci/case/search?'; 

     $http.get(sc.baseURL + url, { params: searchArgs }). 
      then(function (r) { 
       if (!r || !r.data) { 
        console.log('Error: No Data Returned'); 
        deferred.reject('No Data Returned'); 
       } 
       deferred.resolve(r.data); 
      }, function (err) { 
       console.log('Error: ' + err); 
       deferred.reject(err); 
      }); 
     return deferred.promise; 
} 

成功した場合、r.dataには予期した結果が含まれています。しかし、コントローラからHttpResponseExceptionがスローされたとき、私はReasonPhraseをキャッチできません。コントローラでカスタムエラーメッセージをフォーマットし、UIで表示する必要があります。これを行うにはHttpResponseExceptionが適切ですか?ご意見ありがとうございます。

答えて

1

あなたが例外をスローすると、実行フローは中断さとresult.youがエラーを処理し、結果としてエラーメッセージを返す必要がありますように、内部サーバーエラーが返されます。

私はあなたがより良い、このようなAPIコール結果表すクラス定義を考える:私はSTATUSTEXTが、これを試してみました

svc.Search = function (searchArgs) { 
     var deferred = $q.defer(); 
     var url = 'sci/case/search?'; 

     $http.get(sc.baseURL + url, { params: searchArgs }). 
      then(function (r) { 
       if (!r || !r.Succeeded) { 
        console.log('Error: No Data Returned'); 
        deferred.reject('No Data Returned'); 
       } 
       deferred.resolve(r.Result.data); 
      }, function (r) { 
       console.log('Error: ' + r.Message); 
       deferred.reject(r.Message); 
      }); 
     return deferred.promise; 
} 
1

エラーコールバックのstatusTextプロパティ値を参照する必要があります。レスポンスオブジェクトのstatusTextプロパティは、レスポンスのステータステキストを持つ文字列値です。 HttpResponseExceptionは、応答のステータステキストとしてReasonPhraseの値を設定します。

$http.get(sc.baseURL + url, { params: searchArgs }). 
      then(function (r) { 
       if (!r || !r.data) { 
        console.log('Error: No Data Returned'); 
        deferred.reject('No Data Returned'); 
       } 
       deferred.resolve(r.data); 
      }, function (err) { 
       var errMsg = err.statusText; 
       alert(errMsg);    
      }); 
+0

その後、
public class ApiCallResult { public ApiCallResult(){ Succeeded = true; } public object Result {get;set;} public bool Succeeded{get;set;} public string Message {get;set;} } 

public async Task<SearchResult> Search([FromUri] SearchArguments args) { var result = new ApiCallResult(); try { SearchResult searchResult = await _case.Search(args, true); result.Result = searchResult; string validationError = searchResult.Error; if (!string.IsNullOrEmpty(validationError)) { result.Message = string.Format("Could not find the case"); result.Succeeded = false; } } catch (Exception ex) { result.Message = ex.Message; result.Succeeded = false; } return result; } 

とビューの内側を私に "HTTPリクエストの処理で例外が発生しました.HTTPレスポンスのretur詳細についてはこの例外の「レスポンス」プロパティを参照してください。ありがとうございました。 – Jyina

+0

詳細に「内部サーバーエラー」が含まれていますか? –

+0

@ Jyinaカスタムエラーが有効になっていますか? – Shyju

関連する問題