2013-11-08 12 views
1

Here @ GlennBlock отметил, что метание HttpResponseException немедленно прекращает выполнение запроса при возврате HttpResponseMessage не прекращает распространение запроса (как я его понял).Выполняет ли возврат запроса на выполнение запроса IHttpActionResult

Исключение полезно немедленно прекратить обработку и выйти.

Если вместо этого я возвращаю HttpResponseMessage, запрос с удовольствием продолжит остаток его обработки и вернет 404. Основное различие заключается в том, что конец запроса или нет.

В .NET Web API 2 вы также можете вернуть IHttpActionResult от ApiController. Остановляет ли оно распространение запроса или работает аналогично HttpResponseMessage?

Спасибо;)

ответ

3

Я думаю @GlennBlock технически неправильно здесь. Бросок HttpResponseException не делает ничего существенного, чем возвращение HttpResponseMessage.

Вот шаблон используется в ASP.NET Web API любезно source code:

try 
{ 
    return await SendAsyncCore(request, cancellationToken); 
} 
catch (HttpResponseException httpResponseException) 
{ 
    return httpResponseException.Response; 
} 
catch (Exception exception) 
{ 
    exceptionInfo = ExceptionDispatchInfo.Capture(exception); 
} 

На данный момент в трубопроводе, если бы вы выброшено HttpResponseException он получает лечение то же самое, как если бы вы вернулись в HttpResponseMessage ... он ведет себя точно так же.

Одна вещь, которую вы заметите, заключается в том, что при отладке с Visual Studio отладчик будет разбиваться на брошенный HttpResponseException (так как catch не происходит в коде пользователя). Если это ожидаемая ошибка, которая обычно происходит при нормальной работе вашего сайта, тогда это может стать очень раздражающим! В этом случае вы, скорее всего, захотите вернуть код ошибки с HttpResponseMessage.

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

О единственном различии, которое я могу сказать, заключается в том, что бросание HttpResponseException позволяет поймать его с помощью IExceptionFilter. Подобно тому, как вы можете применить фильтр действий или фильтр авторизации к методу или контроллеру, вы можете применить фильтр исключений для обработки всех исключений. Возможно, вы хотите зарегистрировать их в своей базе данных. Очевидно, что намного проще применять фильтр атрибутов, чем писать try/catch в каждом одном методе действия.

В этом случае выброс исключения на самом деле больше работает и занимает больше времени, чем просто возвращает ответ. Но это одно отличие.

IHttpActionResult предназначенный для создания HttpResponseMessage. Подумайте об этом как о фабрике HttpResponseMessage, где вы можете написать ее один раз и использовать ее несколькими методами действий. В этом случае вы можете выбросить HttpResponseException с IHttpActionResult. Это не что иное, как делать это прямо из действия.

+0

Хорошая информация о проблеме отладки.Я думаю, что точка в упомянутом вопросе заключалась в том, что HttpResponseException немедленно останавливает обработку запроса, а HttpResponseMessage - нет. –

+0

Кроме того, я действительно задавался вопросом, как работает IHttpActionResult в сравнении с HttpResposeException и HttpResponseMessage. –

+0

@NikolaiSamteladze Возврат 'HttpResponseMessage' буквально является последним в цепочке запросов. Здесь не нужно останавливать обработку. –