Migration WebApiCompatShim-如何使用MVC6配置RESTAPI

Migration WebApiCompatShim-如何使用MVC6配置RESTAPI,migration,asp.net-core,asp.net-core-mvc,Migration,Asp.net Core,Asp.net Core Mvc,我正在研究如何从WebAPI2迁移到MVC6 我正在尝试在绑定了HttpRequestMessage的控制器中使用操作方法。这在WebAPI2中起作用 [Route("", Name = "AddTaskRoute")] [HttpPost] public Task AddTask(HttpRequestMessage requestMessage, [FromBody]NewTask newTask) { var

我正在研究如何从WebAPI2迁移到MVC6

我正在尝试在绑定了HttpRequestMessage的控制器中使用操作方法。这在WebAPI2中起作用

 [Route("", Name = "AddTaskRoute")]        
 [HttpPost]        
 public Task    AddTask(HttpRequestMessage requestMessage, [FromBody]NewTask newTask)
 {            
      var task = _addTaskMaintenanceProcessor.AddTask(newTask); 
      return task;         
 } 
requestMessage包含有关Http请求的详细信息,如头、动词等

我试图用MVC6实现同样的效果,但是requestMessage似乎绑定不正确,它显示了一些细节,比如当操作实际上是一个POST时获取的方法。我相信我没有按照文章建议配置WebApiCompatShim,因此绑定没有正确完成。但是我没有扩展方法services.AddWebApiConventions;在Microsoft.AspNet.Mvc.WebApiCompatShim:6.0.0-rc1-final版本中提供

有人试过这个吗


PS:my controller中可用的Request属性似乎包含有关http请求的详细信息,但我希望有HttpRequestMessage实例。

在MVC6中,您应该能够使用Request对象获取头信息

var contentTypeHeader = Request.Headers["Content-Type"];
确实,他们删除了一些不错的方法,如Request.CreateResponse和OK等。。但是你可以使用一些替代品

我们将用于创建响应的所有这些类都是从ObjectResult基类继承的。因此,您可以使用ObjectResult作为Web api方法的返回类型

HttpOKObjectResult 在MVC6中,可以使用创建HttpOKObjectResult类的对象,并将其用作返回值,而不是Request.CreateResponse。这将为响应生成状态代码200 OK

Web API2代码

MVC6代码

或者简单地使用OK方法

CreatedAtRouteResult 您可以使用CreatedAtRouteResult类发送带有位置头的201个已创建状态代码的响应

MVC6代码

客户端将在响应中收到一个位置头,它将指向api路由,id参数的值为250

HttpNotFoundObjectResult 您可以使用该类返回404NotFound响应

Web API2代码

MVC6代码


我发现要使用Microsoft.AspNetCore.Mvc.WebApiCompatShim,它应该是services.AddMvc.AddWebApiConventions,而不是services.AddWebApiConventions,如中所示


我在他们的文档中添加了一个反馈项。

使用请求时,您缺少哪些具体信息?请求属性是正确的。但是,我希望使用HttpRequestMessage实例来使用其方法CreateResponse,以便在创建资源时,它向该请求返回201。这就是WebAPI2中的情况,您也应该能够使用MVC6获得所有这些。看看我的答案。为了不太冗长,删除了Http word。HttpOkObjectResult->OkObjectResult已修复,请参见我的问题链接
public HttpResponseMessage Post([FromBody]string value)
{
    var item = new { Name= "test", id = 1 };
    return Request.CreateResponse(HttpStatusCode.OK,item);
}
[HttpPost]
public ObjectResult Post([FromBody]string value)
{
    var item = new {Name= "test", id=1};
    return new HttpOkObjectResult(item);
}
[HttpPost]
public ObjectResult Post([FromBody]string value)
{
    var item = new {Name= "test", id=1};
    return Ok(item);
}
[HttpPost]
public ObjectResult Post([FromBody]string value)
{
    var item = new { Name= "test", id=250};
    return new CreatedAtRouteResult(new { id = 250}, item);
}
public HttpResponseMessage Post([FromBody]string value)
{
    return Request.CreateResponse(HttpStatusCode.NotFound);   
}
[HttpPost]
public ObjectResult Post([FromBody]string value)
{
    return new HttpNotFoundObjectResult("Some");
}