2016-06-23 6 views
1

У меня есть ASP.NET WebAPI (v2) действия контроллера, который имеет следующую общую структуру:WebAPI BadRequest каплепадения Response Data

[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" 
} 

Когда я запускаю тот же код/​​данные на удаленном сервере/производства (IIS 8.5), все, что я вернусь есть:

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

Обычай data полезная нагрузка теряется/отбрасываются от ответ. Этот появляется, относящийся к HttpStatusCode, используемый в Request.CreateResponse(), как будто я меняю HttpStatusCode.BadRequest на HttpStatusCode.OK, после чего загружается пользовательская информация.

Как я могу проверить, я попытался изменить возвращение к Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);, но результаты были одинаковыми, то есть данные были возвращены в качестве простого «Bad Request» строки.

Для справки API вызывается вызовом AngularJS $http.post().

Почему изменение в HttpStatusCode изменяет полезную нагрузку на рабочем сервере, но не локально? Любая помощь приветствуется.

+0

Извините за этот немой вопрос, но я должен спросить - Вы абсолютно уверены в том, что ответ исходит из этого исключения? IIS и Express имеют разные стеки процессов, поэтому исключение может быть из других источников. В IIS запустите с помощью Failed Request Trace, чтобы помочь найти точку исключения –

+0

Если это глупо, я просто задал себе одно и то же :-) Да, я думаю, что это так, но ... Похоже, что это связано с обработка ошибок, используемая на веб-сайте производства. Если я вычеркнул из , тогда данные вернутся правильно. Итак, поскольку это смешанное приложение MVC/WebAPI, то, наверное, мой вопрос заключается в том, как избежать использования обработчиков ошибок по умолчанию для вызовов WebAPI? – Neilski

ответ

1

Оказывается, это было вниз к следующему разделу в Web.config

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

Это был «странным», потому что эти страницы не были возвращены при вызове API, но с их удалением, тем API вызова вернул правильную полезную нагрузку - предположительно, HttpStatusCode.BadRequest был перехвачен обработчиком ошибок где-то, следовательно, потерял исходные данные ответа?

С помощью этих обработчиков я удалил, я прибег к использованию Application_Error обработчика в Global.asax, как описано by ubik404 here.

Возможно, существует лучший/альтернативный способ достижения такого же результата, но это, похоже, работает.