Вопрос по asp.net-web-api, iis, asp.net – Сообщения об ошибках, возвращаемые методом веб-API, опускаются в среде не-dev

23

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

<code>new HttpResponseMessage( HttpStatusCode.Created )
</code>

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

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

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

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

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

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

<code>Status code: 400 (BadRequest)
Response data: Bad Request
</code>

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

Есть идеи? Благодарю.

Ваш Ответ

5   ответов
0

OWIN

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

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

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

PI. Много удивительности. Посмотрите, как получить ночные подписанные сборкиВот.

УниверсальныйHttpResponseMessage<T> больше не поддерживается. использованиеHttpRequestMessage.CreateResponse<T>, Увидетьэтот а такжеэтот.

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

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

UPDATE 8/14/2012 Текущая версия Release Candidate для MVC 4 / Web API достаточно хороша. Вам больше не нужно получать ночные сборки, если вы не хотите оставаться в курсе последних событий.

21

этот пост MSDN в HttpConfiguration.IncludesErrorDetailPolicy:

В вашем Global.asax:

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

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

Это не похоже на работу. Кроме того, это кажется немного широким. Смотрите мой комментарий к вопросу Джейсона. Кроме того, я оставил этот комментарий три дня назад, и когда я вернулся сегодня, комментария здесь не было, и ответ был (ошибочно) принят. Не уверен, что случилось - извините за это. Greg Smalter
3

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

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

<system.web>
    <customErrors mode="Off" />
</system.web>
Это не похоже на работу. В противном случае возник бы новый вопрос: «Почему я должен позволить пользователям моих веб-страниц видеть желтые страницы ошибок сервера со следами стека, чтобы давать информативные ответы веб-службы?». Greg Smalter
15

оек ошибок.

В реальном сценарии вы определенно хотели бы использовать настраиваемую страницу ошибок в своем приложении, но для того, чтобы настраиваемые сообщения об исключениях работали в 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>

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

Похожие вопросы