2016-08-16 55 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 
      }); 
     } 
    } 

它用於angularjs服務,該服務使用http獲取請求調用此函數,如下所示。

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調用結果:

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

和內部的看法:

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

我試過,但狀態文本給我「處理HTTP請求導致異常,請參閱HTTP響應返回詳細信息請參閱此例外的「響應」屬性。「謝謝。 – Jyina

+0

詳細信息是否包含「內部服務器錯誤」? –

+0

@Jyina您是否啓用了自定義錯誤? – Shyju