【问题标题】:WebApiCompatShim - how to configure for a REST api with MVC 6WebApiCompatShim - 如何使用 MVC 6 配置 REST api
【发布时间】:2016-04-05 01:43:26
【问题描述】:

我正在查看 this link,它展示了如何从 Web API 2 迁移到 MVC 6。

我试图在我的控制器中使用HttpRequestMessage 绑定的 Action 方法。这适用于 Web Api 2。

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

requestMessage 包含 Http 请求的详细信息,例如 headers、verb 等。

我正在尝试使用 MVC 6 获得相同的结果,但 requestMessage 似乎绑定不正确,并且它显示了详细信息,例如当操作实际上是 POST 时方法是 GET。我相信我没有按照文章建议配置 WebApiCompatShim,因此绑定没有正确完成。但是我没有"Microsoft.AspNet.Mvc.WebApiCompatShim": "6.0.0-rc1-final"版本中提供的扩展方法services.AddWebApiConventions();

有人试过这个成功了吗?

PS:我的控制器中可用的Request 属性似乎包含有关http 请求的详细信息,但我想要HttpRequestMessage 实例。

【问题讨论】:

  • 您在使用Request时遗漏了哪些具体信息?
  • Request 属性正确。但是我想使用 HttpRequestMessage 实例来使用它的方法 CreateResponse() 以便在创建资源时它会向该请求返回 201。这就是它在 Web Api 2 中的样子
  • 您应该也可以使用 MVC6 获得所有这些。看看我的回答。

标签: migration asp.net-core asp.net-core-mvc


【解决方案1】:

我发现要使用 Microsoft.AspNetCore.Mvc.WebApiCompatShim,它应该是 services.AddMvc().AddWebApiConventions() see this example 而不是 services.AddWebApiConventions(),如 the docs 所示。

我正在他们的文档中添加反馈项。

【讨论】:

  • 并且已经修复(见我的问题链接)
【解决方案2】:

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

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

确实,他们删除了一些不错的方法,例如 Request.CreateResponse()OK() 等。但是您可以使用一些替代方法。

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

HttpOKObjectResult

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

Web 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 标头,该标头将指向 id 参数值为 250 的 api 路由。

HttpNotFoundObjectResult

您可以使用此类返回404 Not found 响应。

Web 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");
}

【讨论】:

  • Http 词被删除,以免过于冗长。 HttpOkObjectResult -> OkObjectResult
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多