2016-08-16 68 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