在为ASP.NET Web API2 Attribute Routing功能进行动手操作时,我发现此功能存在一些奇怪的差异。
要使用属性路由,我们必须使用Route(“”)属性并指定自定义路由。
[Route("api/books")]
public IEnumerable<Book> GetBooks() { ... }
[Route("api/books/{id:int}")]
public Book GetBook(int id) { ... }
WebAPI 2中的HttpPost
,HttpGet
,HttpPut
和HttpDelete
属性也发生了变化。它引入了额外的构造函数来指定使用属性的路由。 (示例 - Simple Talk by Dino和Visual Studio Magazine article)
[HttpGet("orders/{id:int:range(1, 100)}/show"]
我为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
实现。
我在这里遗漏了什么。
答案 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" />