Как я могу закодировать ответ Created-201 с помощью IHttpActionResult
?
IHttpActionResult
имеет только эти параметры
- ОК
- Пункт списка
- Не обнаружена
- Исключение
- неразрешенный
- BadRequest
- Перенаправление конфликта
- InvalidModelState
Сейчас я делаю этот код ниже, но я бы хотел использовать IHttpActionResult
, а не HttpResponseMessage
public IHttpActionResult Post(TaskBase model)
{
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, model);
response.Headers.Add("Id", model.Id.ToString());
return ResponseMessage(response);
}
5 ответов
Если ваше представление является производным от ApiController
, вы должны иметь возможность вызвать метод Created
из базового класса для создания такого ответа.
Образец:
[Route("")]
public async Task<IHttpActionResult> PostView(Guid taskId, [FromBody]View view)
{
// ... Code here to save the view
return Created(new Uri(Url.Link(ViewRouteName, new { taskId = taskId, id = view.Id })), view);
}
ApiController
?
В ASP.NET Core можно вернуть IActionResult
. Это означает, что вы можете вернуть ObjectResult
с кодом состояния 201.
[HttpPost]
public async Task<IActionResult> PostAsync([FromBody] CreateModel createModel)
{
// Create domain entity and persist
var entity = await _service.Create(createModel);
// Return 201
return new ObjectResult(entity) { StatusCode = StatusCodes.Status201Created };
}
return Content(HttpStatusCode.Created, "Message");
Контент возвращает NegotiatedContentResult. NegotiatedContentResult реализует IHttpActionResult.
Аналогичная проблема: если вы хотите отправить NotFound с сообщением.
return Content(HttpStatusCode.NotFound, "Message");
Или же:
return Content(HttpStatusCode.Created, Class object);
return Content(HttpStatusCode.NotFound, Class object);
В качестве альтернативы тому, что предлагает Крис, вы можете вернуть IActionResult, используя метод или "StatusCode", следующим образом:
[HttpPost]
public async Task<IActionResult> PostAsync([FromBody] CreateModel createModel)
{
// Create domain entity and persist
var entity = await _service.Create(createModel);
// Return 201
return StatusCode(StatusCodes.Status201Created, entity);
}
Я знаю, что это старый поток, но вы можете взглянуть на мое решение здесь. Его немного больше, чем нужно, но он наверняка выполнит свою работу.
Шаги:
Определите настраиваемый атрибут:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public sealed class UniqueIdAttribute: Attribute
{
}
Украсьте однозначно идентифицирующее свойство вашей модели настраиваемым атрибутом:
public class Model
{
public List<Model> ChildModels { get; set; }
[UniqueId]
public Guid ModelId { set; get; }
public Guid ? ParentId { set; get; }
public List<SomeOtherObject> OtherObjects { set; get; }
}
Добавьте новый метод Created(T yourobject);
в BaseController, который наследуется от ApiController. Наследуйте все свои контроллеры от этого BaseController:
CreatedNegotiatedContentResult<T> Created<T>(T content)
{
var props =typeof(T).GetProperties()
.Where(prop => Attribute.IsDefined(prop, typeof(UniqueIdAttribute)));
if (props.Count() == 0)
{
//log this, the UniqueId attribute is not defined for this model
return base.Created(Request.RequestUri.ToString(), content);
}
var id = props.FirstOrDefault().GetValue(content).ToString();
return base.Created(new Uri(Request.RequestUri + id), content);
}
Это довольно просто, не беспокоясь о написании так много в каждом методе. Все, что вам нужно сделать, это просто позвонить Created(yourobject);
Метод Created () все равно будет работать, если вы забудете украсить или не можете украсить свою модель (по какой-то причине). Однако в заголовке местоположения не будет идентификатора.
Ваш модульный тест для этого контроллера должен позаботиться об этом.
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.
HttpResponseMessage
, в котором я могу указать все глаголы и тело только что вызванного методаRequest.CreateRespose()
.