Я работал с WebApi и перешел к WebApi2, где Microsoft представила новый IHttpActionResult
интерфейс, который, кажется, рекомендуется использовать вместо возврата a HttpResponseMessage
. Я запутался в преимуществах этого нового интерфейса. Похоже, что в основном это просто НЕМНОГО более простой способ создания HttpResponseMessage
.
Я бы сделал аргумент, что это «абстракция ради абстракции». Я что-то упускаю? Какие преимущества в реальном мире я получаю от использования этого нового интерфейса, кроме, возможно, сохранения строки кода?
Старый способ (WebApi):
public HttpResponseMessage Delete(int id)
{
var status = _Repository.DeleteCustomer(id);
if (status)
{
return new HttpResponseMessage(HttpStatusCode.OK);
}
else
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
}
Новый путь (WebApi2):
public IHttpActionResult Delete(int id)
{
var status = _Repository.DeleteCustomer(id);
if (status)
{
//return new HttpResponseMessage(HttpStatusCode.OK);
return Ok();
}
else
{
//throw new HttpResponseException(HttpStatusCode.NotFound);
return NotFound();
}
}
c#
asp.net-web-api
httpresponse
Джейсон Роелл
источник
источник
HttpResponseMessage
я получил ответ в 9545 мс . * ИспользуяIHttpActionResult
I, я получил тот же ответ в 294 мс .Ответы:
Возможно, вы решите не использовать,
IHttpActionResult
потому что ваш существующий код создает такойHttpResponseMessage
, который не соответствует ни одному из стандартных ответов. Однако вы можете адаптироватьсяHttpResponseMessage
кIHttpActionResult
использованию постоянного ответаResponseMessage
. Мне потребовалось некоторое время, чтобы понять это, поэтому я хотел опубликовать это, показывая, что вам не обязательно выбирать один или другой:Обратите внимание,
ResponseMessage
это метод базового классаApiController
, от которого ваш контроллер должен наследовать.источник
ResponseMessage
иResponseMessageResult
это две разные вещи.ResponseMessage()
это метод, отApiController
которого ваш контроллер должен наследовать, и, следовательно, это просто вызов метода. Так что здесь неnew
нужно ключевое слово. Вы, вероятно, не наследуетеApiController
или находитесь внутри статического метода.ResponseMessageResult
тип возвращаемого значенияResponseMessage()
.response = base.ResponseMessage(responseMsg)
чтобы прояснить, что это метод базового класса ApiControllerВы все еще можете использовать
HttpResponseMessage
. Эта возможность не исчезнет. Я чувствовал то же самое, что и вы, и много спорил с командой, что нет необходимости в дополнительной абстракции. Было несколько аргументов, чтобы попытаться оправдать его существование, но ничто не убедило меня в том, что оно того стоит.То есть, пока я не увидел этот образец от Брэда Уилсона . Если вы создаете
IHttpActionResult
классы так, чтобы их можно было объединить в цепочку, вы получаете возможность создать конвейер ответов «на уровне действия» для генерацииHttpResponseMessage
. Под покровами, это то, какActionFilters
это реализовано, однако порядок ихActionFilters
не очевиден при чтении метода действия, и это одна из причин, по которой я не фанат фильтров действий.Однако, создавая,
IHttpActionResult
который может быть явно связан в вашем методе действия, вы можете составить все виды различного поведения для генерации вашего ответа.источник
Вот несколько преимуществ
IHttpActionResult
надHttpResponseMessage
упомянутым в Microsoft ASP.Net документации :Но вот некоторые другие преимущества использования, о которых
IHttpActionResult
стоит упомянуть:Ok
NotFound
Exception
Unauthorized
BadRequest
Conflict
Redirect
InvalidModelState
( ссылка на полный список )ExecuteAsync
метод.ResponseMessageResult ResponseMessage(HttpResponseMessage response)
для преобразования HttpResponseMessage в IHttpActionResult .источник
источник
Это только мое личное мнение, и ребята из команды веб-API, вероятно, могут сформулировать это лучше, но вот мой 2c.
Прежде всего, я думаю, что это не вопрос одного над другим. Вы можете использовать их оба в зависимости от того, что вы хотите сделать в вашем методе действия, но чтобы понять реальную силу
IHttpActionResult
, вам, вероятно, нужно будет выйти за пределы таких удобных вспомогательных методовApiController
, какOk
,NotFound
и т. Д.В основном, я думаю, что класс реализуется
IHttpActionResult
как фабрикаHttpResponseMessage
. С таким настроем он теперь становится объектом, который необходимо вернуть, и фабрикой, которая его производит. В общем смысле программирования, вы можете создать объект самостоятельно в определенных случаях, а в некоторых случаях вам нужна фабрика для этого. Тоже самое.Если вы хотите вернуть ответ, который должен быть построен с помощью сложной логики, скажем, большого количества заголовков ответа и т. Д., Вы можете абстрагировать всю эту логику в реализующий класс действия
IHttpActionResult
и использовать его в нескольких методах действия для возврата ответа.Еще одним преимуществом использования в
IHttpActionResult
качестве возвращаемого типа является то, что он делает метод действия ASP.NET Web API похожим на MVC. Вы можете вернуть любой результат действия, не попадая в средства форматирования медиа.Конечно, как отметил Даррел, вы можете объединить результаты действий и создать мощный микропроцесс, подобный самим обработчикам сообщений в конвейере API. Это вам понадобится в зависимости от сложности вашего метода действий.
Короче говоря - это не
IHttpActionResult
противHttpResponseMessage
. По сути, это то, как вы хотите создать ответ. Сделай сам или через фабрику.источник
ResponseFactory.CreateOkResponse()
этот, возвращающие HttpResponseMessage, и мне не приходилось иметь дело с асинхронными вещами при создании ответа. Один из членов команды упомянул тот факт, что асинхронность может быть полезна, если вам нужно выполнить ввод-вывод для генерации значений заголовка. Не уверен, как часто это происходит, хотя.Web API в основном возвращает 4 типа объекта:
void
,HttpResponseMessage
,IHttpActionResult
, и другие сильные тип. Первая версия Web API возвращаетHttpResponseMessage
довольно простое ответное сообщение HTTP.Он
IHttpActionResult
был представлен WebAPI 2, который является своего рода оберткойHttpResponseMessage
. Он содержитExecuteAsync()
метод для созданияHttpResponseMessage
. Это упрощает модульное тестирование вашего контроллера.Другой тип возвращаемых данных - это классы со строгой типизацией, сериализуемые Web API с использованием средства форматирования мультимедиа в теле ответа. Недостатком было то, что вы не можете напрямую вернуть код ошибки, такой как 404. Все, что вы можете сделать, это выдать
HttpResponseException
ошибку.источник
Я бы предпочел реализовать интерфейсную функцию TaskExecuteAsync для IHttpActionResult. Что-то вроде:
где _request - HttpRequest, а _respContent - полезная нагрузка.
источник
У нас есть следующие преимущества использования
IHttpActionResult
болееHttpResponseMessage
:IHttpActionResult
мы концентрируемся только на данных для отправки, а не на коде состояния. Так что здесь код будет чище и очень прост в обслуживании.async
иawait
по умолчанию.источник