使用Http动词属性的WebApi 2属性路由

时间:2014-01-12 04:52:51

标签: asp.net-web-api

在为ASP.NET Web API2 Attribute Routing功能进行动手操作时,我发现此功能存在一些奇怪的差异。

  1. 要使用属性路由,我们必须使用Route(“”)属性并指定自定义路由。

    [Route("api/books")]
    public IEnumerable<Book> GetBooks() { ... }
    
    [Route("api/books/{id:int}")]
    public Book GetBook(int id) { ... }
    
  2. WebAPI 2中的HttpPostHttpGetHttpPutHttpDelete属性也发生了变化。它引入了额外的构造函数来指定使用属性的路由。 (示例 - Simple Talk by DinoVisual Studio Magazine article

    [HttpGet("orders/{id:int:range(1, 100)}/show"]
    
  3. 我为Visual Studio 2012安装了Microsoft ASP.NET和Web Tools 2013.1,并使用Web API2空项目模板创建了示例WebAPI2应用程序。如果我们使用带有路由的HttpPost属性作为字符串,它会给出错误,构造函数不能获取属性。

    我也尝试使用nuget Package Microsoft.AspNet.WebApi 5.0.0版。然后我下载了Visual Studio Magazine Article中列出的文章的源代码。但奇怪的是我可以看到使用输入路径的HttpPost属性。有一点不同我注意到System.Web.Http.HttpPostAttribute来自HttpVerbAttribute,其中我的System.Web.Http.HttpPostAttribute版本来自Attribute并实现IActionHttpMethodProvider接口

    我继续从CodePlex下载了Asp.NET Mvc源代码,但奇怪的是我没有找到使用默认构造函数和单参数构造函数的System.Web.Http.HttpPostAttribute实现。

    我在这里遗漏了什么。

2 个答案:

答案 0 :(得分:3)

Web API和MVC是两个完全不同的框架,它们具有重叠功能的类。不要在Web API相关类中引用MVC名称空间。 实际上,理想情况下,我会创建一个单独的项目来保存与Web API相关的内容,并且没有对System.Web的引用。这应该可以防止碰撞。

答案 1 :(得分:1)

+1关于达雷尔提到的内容。

此帖子中2.点的格式也是版本5.0的最终版本之前支持的格式。因此,请确保您的MVC和Web API nuget包具有以下版本,以支持1.中的格式。它们应如下所示:

  <package id="Microsoft.AspNet.Mvc" version="5.0.0" targetFramework="net451" />
  <package id="Microsoft.AspNet.Razor" version="3.0.0" targetFramework="net451" />
  <package id="Microsoft.AspNet.Web.Optimization" version="1.1.1" targetFramework="net451" />
  <package id="Microsoft.AspNet.WebApi" version="5.0.0" targetFramework="net451" />
  <package id="Microsoft.AspNet.WebApi.Client" version="5.0.0" targetFramework="net451" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.0.0" targetFramework="net451" />
  <package id="Microsoft.AspNet.WebApi.HelpPage" version="5.0.0" targetFramework="net451" />
  <package id="Microsoft.AspNet.WebApi.WebHost" version="5.0.0" targetFramework="net451" />