2016-06-23 4 views
1

I가 다음과 같은 일반적인 구조를 가진 ASP.NET WebAPI (V2) 컨트롤러 액션 : WebAPI BadRequest 떨어 뜨리 응답 데이터

[HttpPost] 
public HttpResponseMessage Post(UserDTO model) 
{ 
    try { 
     // do something 
    } 
    catch (Exception ex) 
    { 
     var error = new { 
      errorMessage = ex.Message, 
      userId = 123, 
      // some other simple data 
     }; 
     return Request.CreateResponse(HttpStatusCode.BadRequest, error); 
    } 

    return Request.CreateResponse(HttpStatusCode.OK, model); 
} 

내 지역 개발 서버에서이 작업을 실행

( IIS 익스프레스) 오류가 발생하면 기대 한 JSON 페이로드를 다시 얻습니다.
{ 
    config: {...}, 
    data: { 
     errorMessage: "User invalid", 
     userId: 123, 
     ... 
    }, 
    status: 400, 
    statusText: "Bad Request" 
} 

나도 같은 코드를 실행

은/원격/프로덕션 서버의 데이터는 (8.5 IIS), 모두 내가 돌아 얻을 :

{ 
    config: {...}, 
    data: "Bad Request, 
    status: 400, 
    statusText: "Bad Request" 
} 

data 페이로드가 손실의 사용자 정의/멀리 제거 응답. 이 HttpStatusCode.BadRequest에서 HttpStatusCode.OK으로 변경 한 것처럼 Request.CreateResponse() 호출에 사용 된 HttpStatusCode과 관련된으로 표시되며 사용자 정의 데이터 페이로드가 다운로드됩니다. I 테스트 같이

, 난 Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); 복귀를 변경하려고하지만 결과는 동일, 즉 데이터가 간단한 "잘못된 요청" 문자열로 반환이었다.

참조를 위해 API는 AngularJS $http.post() 호출에 의해 호출됩니다.

HttpStatusCode의 변경으로 인해 프로덕션 서버에서 응답 페이로드가 변경되는 이유는 무엇입니까? 어떤 도움이라도 대단히 감사 할 것입니다.

+0

이 멍청한 질문에 대해 사과드립니다.하지만이 질문에 대한 답변은 확실합니까? IIS와 Express에는 다른 프로세스 스택이 있으므로 예외는 다른 곳에서있을 수 있습니다. IIS에서 실패한 요청 추적을 사용하여 예외 지점을 찾을 수 있습니다. –

+0

바보 인 경우 방금 똑같은 질문을했습니다 :-) 예, 생각 합니다만 ... 관련이있는 것 같습니다. 프로덕션 웹 사이트에서 사용 된 오류 처리 에서 를 제거하면 데이터가 올바르게 반환됩니다. 그래서, 이것은 혼합 된 MVC/WebAPI 응용 프로그램으로 다음 내 질문에 있어야합니다 WebAPI 호출에 대한 기본 오류 처리기를 호출하는 것을 피하는 것 같아요? – Neilski

답변

1

이것이의 Web.config에서 아래로 다음 섹션이었다 밝혀

이 페이지는 그러나 그들의 제거, API 호출로, API 호출에 의해 반환되지 않았기 때문에 그것은 '이상한'입니다
<system.webServer> 
    <httpErrors errorMode="Custom" existingResponse="Replace"> 
     <remove statusCode="403" /> 
     <error statusCode="403" responseMode="ExecuteURL" 
       path="/Error/AccessDenied" /> 
     <remove statusCode="404" /> 
     <error statusCode="404" responseMode="ExecuteURL" 
       path="/Error/NotFound" /> 
     <remove statusCode="500" /> 
     <error statusCode="500" responseMode="ExecuteURL" 
       path="/Error/ApplicationError" /> 
    </httpErrors> 
</system.webServer> 

올바른 페이로드를 반환했습니다. 아마도 HttpStatusCode.BadRequest이 어딘가의 오류 처리기에 의해 차단되어 원본 응답 데이터가 손실되었을 것입니다. I 제거한 다음 핸들러

, 난 by ubik404 here 바와 같이 Global.asax에 Application_Error 핸들러를 사용에 의존.

동일한 결과를 얻으려면 더 나은/대체 방법이있을 수 있지만 작동하는 것 같습니다.

관련 문제