Подтвердить что ты не робот

Сообщения об ошибках, возвращаемые из метода Web API, опущены в среде, отличной от dev.

У меня есть POST-метод контроллера API, который отлично работает локально и на сервере тестирования. Если все будет хорошо, он вернется:

new HttpResponseMessage( HttpStatusCode.Created )

Если что-то пойдет не так, оно возвращает:

new HttpResponseMessage<IEnumerable<string>>( usefulMessages, HttpStatusCode.BadRequest );

Проблема заключается в том, что когда я делаю запрос на сервер тестирования, который приводит к ошибке, я получаю код с неправильным запросом, но я никогда не вижу сообщений. Если я сделаю тот же запрос на свой локальный компьютер, я увижу сообщения. Следующие результаты выводятся из моего собственного инструмента:

Отправка запроса на мой локальный компьютер я получаю:

Status code: 400 (BadRequest)
Response data: ["Error message one", "Error message two"]

Отправка запроса на тестовый сервер я получаю:

Status code: 400 (BadRequest)
Response data: Bad Request

Выполняемый код точно такой же. База данных такая же. Все одно и то же, за исключением сервера, обслуживающего запрос. У меня даже есть код, который отправляет мне сообщения об ошибках, поэтому я знаю, что сервер создает правильные сообщения об ошибках и ведет себя правильно. Может ли это быть IIS (например, эквивалент customErrors = RemoteOnly для Web API)? Мало того, что сообщения об ошибках не указаны в данных ответа, что-то побуждает вместо этого добавить фразу "Bad Request".

Любые идеи? Спасибо.

4b9b3361

Ответ 1

Взгляните на этот пост MSDN в HttpConfiguration.IncludesErrorDetailPolicy:

В вашем Global.asax:

var config = GlobalConfiguration.Configuration;
config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;

Я использовал это свойство конфигурации, чтобы заставить сообщения об ошибках включать данные.

Ответ 2

Была та же проблема. Это действительно из-за настройки пользовательских ошибок.

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

Как это исправить? К счастью, вы можете использовать элемент <location> в вашем web.config, чтобы решить эту проблему.

Решение:

  <!-- General for the application -->
  <system.web>
    <customErrors mode="RemoteOnly" defaultRedirect="YourCustomErrorPage.aspx"/>
  </system.web>

  <!-- Override it for paths starting with api (your WebAPI) -->
  <location path="api">
     <system.web>
        <customErrors mode="Off" />
     </system.web>
  </location>

Я использую этот метод в своем приложении, хорошо работает.

Ответ 3

Звучит так, как будто это может быть для вас особый режим обхода. WebAPI работает поверх ASP.NET(MVC), поэтому он использует все те же настройки web.config.

Если это тестовый сервер, вы можете попробовать отключить customErrors.

<system.web>
    <customErrors mode="Off" />
</system.web>

Ответ 4

С момента бета-версии базы данных веб-API было много изменений. Много удивительности. Посмотрите, как получить ночные подписанные сборки здесь.

Общий HttpResponseMessage<T> больше не поддерживается. Используйте HttpRequestMessage.CreateResponse<T>. См. this и this.

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

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

ОБНОВЛЕНИЕ 8/14/2012 Текущий кандидат на выпуск MVC 4/Web API достаточно хорош. Вам больше не нужно приобретать ночную сборку, если вы не хотите оставаться в курсе последних событий.

Ответ 5

Owin

Поскольку выбор хоста здесь не упоминается, я просто хотел добавить, что в случае OWIN вы должны использовать решение syneptody, НО в Global.asax, согласно этому ответу и моим собственным тестам.

Вы хотите вставить IncludeErrorDetailPolicy.Always в Startup.cs файле:

public void Configuration(IAppBuilder appBuilder)
{
    HttpConfiguration Config = new HttpConfiguration(); 
    Config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
    ...
}