Я смотрел эта ссылка показывает, как перейти с Web API 2 на MVC 6.

Я пытаюсь использовать методы действия в своих контроллерах с привязкой HttpRequestMessage. Это работает в Web Api 2.

 [Route("", Name = "AddTaskRoute")]        
 [HttpPost]        
 public Task    AddTask(HttpRequestMessage requestMessage, [FromBody]NewTask newTask)
 {            
      var task = _addTaskMaintenanceProcessor.AddTask(newTask); 
      return task;         
 } 

А requestMessage содержит подробную информацию о запросе Http, такую ​​как заголовки, глагол и т. д.

Я пытаюсь получить то же самое с MVC 6, но requestMessage кажется неправильно привязанным и показывает такие детали, как метод GET, когда действие фактически является POST. Я считаю, что я не настроил WebApiCompatShim в соответствии с рекомендациями в статье, поэтому привязка не выполняется должным образом. Но у меня нет метода расширения services.AddWebApiConventions();, доступного в версии "Microsoft.AspNet.Mvc.WebApiCompatShim": "6.0.0-rc1-final"

Кому-нибудь удалось это попробовать?

PS: Свойство Request, доступное в моем контроллере, похоже, содержит подробную информацию о HTTP-запросе, но я бы хотел иметь экземпляр HttpRequestMessage.

2
diegosasw 31 Дек 2015 в 06:02

2 ответа

Лучший ответ

В MVC6 вы должны иметь возможность использовать объект Request для получения информации заголовка.

var contentTypeHeader = Request.Headers["Content-Type"];

Это правда, что они удалили некоторые из хороших методов, таких как Request.CreateResponse() и OK() и т. Д. Но есть некоторые альтернативы, которые вы можете использовать.

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

HttpOKObjectResult

В MVC6 вы можете создать объект класса HttpOKObjectResult и использовать его в качестве возвращаемого значения вместо Request.CreateResponse(). Это приведет к появлению кода состояния 200 OK для ответа.

Код веб-API2

public HttpResponseMessage Post([FromBody]string value)
{
    var item = new { Name= "test", id = 1 };
    return Request.CreateResponse(HttpStatusCode.OK,item);
}

Код MVC 6

[HttpPost]
public ObjectResult Post([FromBody]string value)
{
    var item = new {Name= "test", id=1};
    return new HttpOkObjectResult(item);
}

Или просто используйте метод OK().

[HttpPost]
public ObjectResult Post([FromBody]string value)
{
    var item = new {Name= "test", id=1};
    return Ok(item);
}

CreatedAtRouteResult

Вы можете использовать класс CreatedAtRouteResult для отправки ответа с кодом состояния 201 Created с заголовком местоположения.

Код MVC 6

[HttpPost]
public ObjectResult Post([FromBody]string value)
{
    var item = new { Name= "test", id=250};
    return new CreatedAtRouteResult(new { id = 250}, item);
}

Клиент получит в ответ заголовок location, который будет указывать на маршрут api с 250 в качестве значения параметра id.

HttpNotFoundObjectResult

Вы можете использовать этот класс для возврата ответа 404 Not found.

Код веб-API2

public HttpResponseMessage Post([FromBody]string value)
{
    return Request.CreateResponse(HttpStatusCode.NotFound);   
}

Код MVC 6

[HttpPost]
public ObjectResult Post([FromBody]string value)
{
    return new HttpNotFoundObjectResult("Some");
}
3
Shyju 29 Мар 2016 в 02:40

Я обнаружил, что для использования Microsoft.AspNetCore.Mvc.WebApiCompatShim он должен быть services.AddMvc().AddWebApiConventions() см. этот пример вместо services.AddWebApiConventions(), как показано в документы.

Я добавляю отзыв об их документах.

0
Aligned 1 Июн 2018 в 15:09