Я пытаюсь вернуть код состояния 304, не модифицированный для метода GET, в контроллере веб-API.
Единственный способ, которым я преуспел, был чем-то вроде этого:
public class TryController : ApiController
{
public User GetUser(int userId, DateTime lastModifiedAtClient)
{
var user = new DataEntities().Users.First(p => p.Id == userId);
if (user.LastModified <= lastModifiedAtClient)
{
throw new HttpResponseException(HttpStatusCode.NotModified);
}
return user;
}
}
Проблема здесь в том, что это не исключение, просто оно не изменено, поэтому кеш клиента в порядке. Я также хочу, чтобы возвращаемый тип был User (как показывают все примеры веб-API с помощью GET), а не возвращал HttpResponseMessage или что-то вроде этого.
beta
или ночные сборки ?new HttpResponseMessage(HttpStatusCode.NotModified)
? Это не работает?Ответы:
Я не знал ответа, поэтому спросил команду ASP.NET здесь .
Таким образом, хитрость заключается в том, чтобы изменить подпись
HttpResponseMessage
и использоватьRequest.CreateResponse
.источник
GetUser(request, id, lastModified).TryGetContentValue(out user)
, гдеuser
(в данном примере) этоUser
объект.IHttpActionResult
и вы хотите вернуть пользователя, вы можете просто сделатьreturn Ok(user)
. Если вам нужно вернуть другой код состояния (скажем, запрещено), вы можете просто сделатьreturn this.StatusCode(HttpStatusCode.Forbidden)
.Вы также можете сделать следующее, если хотите сохранить подпись действия как возвращающего пользователя:
Если вы хотите вернуть что-то, кроме
200
этого, вы добавляетеHttpResponseException
в свое действие и передаете, чтоHttpResponseMessage
вы хотите отправить клиенту.источник
NotModified
действительно расточительно. Если все ваши API сделали это, то ваш сервер будет в основном преобразовывать ватты в исключения.В MVC 5 все стало проще:
источник
Измените метод API GetXxx, чтобы он возвращал HttpResponseMessage, а затем возвращайте типизированную версию для полного ответа и нетипизированную версию для ответа NotModified.
* Данные ClientHasStale - это мое расширение для проверки заголовков ETag и IfModifiedSince.
Среда MVC все еще должна сериализовать и вернуть ваш объект.
НОТА
Я думаю, что общая версия удаляется в какой-то будущей версии Web API.
источник
Я ненавижу наталкиваться на старые статьи, но это первый результат для этого в поиске Google, и у меня было много времени с этой проблемой (даже при поддержке вас, ребята). Так что здесь ничего не идет ...
Надеюсь, мое решение поможет тем, кто также был сбит с толку.
а потом просто наследовать от BaseController
а затем использовать его
источник
.net core 2.2 возвращает код состояния 304. Это использует ApiController.
При желании вы можете вернуть объект с ответом
источник
Для ASP.NET Web Api 2 этот пост от MS предлагает изменить тип возвращаемого значения метода на
IHttpActionResult
. Затем вы можете вернуть встроеннуюIHttpActionResult
реализацию, напримерOk
,BadRequest
и т. Д. ( См. Здесь ) или вернуть собственную реализацию.Для вашего кода это можно сделать так:
источник
Другой вариант:
источник
источник
Если вам нужно вернуть IHttpActionResult и вы хотите вернуть код ошибки плюс сообщение, используйте:
источник
Мне не нравится менять свою подпись для использования типа HttpCreateResponse, поэтому я придумал немного расширенного решения, чтобы скрыть это.
Затем вы можете добавить метод к вашему ApiController (или лучше к вашему базовому контроллеру) следующим образом:
Затем вы можете вернуть его, как любой из встроенных методов:
источник
Обновление @Aliostads отвечает с использованием большего количества модов,
IHttpActionResult
представленных в Web API 2.https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/action-results#ihttpactionresult
источник
Попробуй это :
источник