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

아래의 http get 요청을 사용하여이 함수를 호출하는 angularjs 서비스에 사용됩니다.

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를 catch 할 수 없습니다. 컨트롤러에서 사용자 정의 오류 메시지를 형식화하고 UI에 표시해야합니다. 이 작업을 수행하려면 HttpResponseException이 적절한가요? 어떤 제안이있어 주셔서 감사합니다.

답변

1

은 실행 흐름이 중단됩니다 및 내부 서버 오류가 result.you가 오류를 처리하고 결과로 오류 메시지를 반환해야합니다으로 반환됩니다.

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 속성은 응답의 상태 텍스트가있는 문자열 값입니다. HttpResponseExceptionReasonPhrase 값을 응답의 상태 텍스트로 설정합니다. 당신이 예외를 던질 때

$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

내가하는 statusText하지만이 시도 후

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

:

난 당신이 더 나은이 같은 API 호출 결과를 표현하는 클래스를 정의 생각 "HTTP 요청 처리 중 예외가 발생했습니다 .HTTP 응답 반환을 참조하십시오. 자세한 내용은이 예외의 '응답'속성에서 확인할 수 있습니다. " 고맙습니다. – Jyina

+0

세부 정보에 "내부 서버 오류"가 있습니까? –

+0

@Jyina 맞춤 오류가 사용 설정되어 있습니까? – Shyju

관련 문제