Как я могу кодировать ответ "Создано-201" с помощью IHttpActionResult

Как я могу закодировать ответ "Созданный-201" с помощью IHttpActionResult?

IHttpActionResult имеет только эти параметры

  • Ok
  • Элемент списка
  • NotFound
  • Исключение
  • Несанкционированное
  • 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);
         }

Ответ 1

Если ваше представление происходит от 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);
}

Ответ 2

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);

Ответ 3

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

Шаги:

Определите пользовательский атрибут:

[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);

Метод Create() будет работать, если вы забудете украсить или не украсить свою модель (по какой-то причине). Заголовок заголовка будет пропускать идентификатор, хотя.

Ваш unit test для этого контроллера должен позаботиться об этом.