多个 GET 对属性路由没有好处?
Multiple GET no good w/ Attribute Routing?
这应该是正确的:
/api/MyDataController.cs
public class MyDataController: ApiController
{
[HttpGet]
[Route("GetOne")]
public IHttpActionResult GetOne() { } // works w/o GetTwo
[HttpGet]
[Route("GetTwo")]
public IHttpActionResult GetTwo() { }
}
.js
$http({method: 'GET', url: '/api/MyData/GetOne'})... //works w/o GetTwo
$http({method: 'GET', url: '/api/MyData/GetTwo'})...
与相同,API版本为
<package id="Microsoft.AspNet.WebApi" version="5.2.3"
targetFramework="net461" />
同时拨打 One 和 Two 都抱怨 GetOne,
"Multiple actions were found that match the request: GetOne on type
MyWeb.API.MyDataControllerGetOne on type
MyWeb.API.MyDataController"
如果从 Api 控制器中移除 GetTwo(),它会起作用。
这看起来应用程序仍在使用 convention-based 路由。
冲突的原因是默认的convention-based路由模板api/{controller}/{id}
通常不提供这样的操作参数api/{controller}/{action}/{id}
。如果您想在使用之前提供的模板时通过 convention-routing 执行 post 操作。
如果您想使用属性路由,那么您需要在 WebApiConfig.cs
文件中启用属性路由,以允许 Rout
属性工作。
public static class WebApiConfig {
public static void Register(HttpConfiguration config) {
// Attribute routing.
config.MapHttpAttributeRoutes();
// Convention-based routing.
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
您还需要更新您的路线以获得您想要的
[RoutePrefix("MyData")]
public class MyDataController: ApiController {
//GET MyData/GetOne
[HttpGet]
[Route("GetOne")]
public IHttpActionResult GetOne() { }
//GET MyData/GetTwo
[HttpGet]
[Route("GetTwo")]
public IHttpActionResult GetTwo() { }
}
在此处阅读属性路由 Attribute Routing in ASP.NET Web API 2
这是对像我这样的传统应用开发者的额外回答:
- 将一个巨大的遗留 .aspx WebForm 应用程序从 VS 08 (.NET 2.x) 迁移到 VS
15(.NET 4.6)
- 通过添加 API 等新技术来复活。
经过挖掘,this 是最好的发现。如果您只有 Global.asax 而没有 .cs,只需将其添加到 .asax 中即可。
这应该是正确的:
/api/MyDataController.cs
public class MyDataController: ApiController
{
[HttpGet]
[Route("GetOne")]
public IHttpActionResult GetOne() { } // works w/o GetTwo
[HttpGet]
[Route("GetTwo")]
public IHttpActionResult GetTwo() { }
}
.js
$http({method: 'GET', url: '/api/MyData/GetOne'})... //works w/o GetTwo
$http({method: 'GET', url: '/api/MyData/GetTwo'})...
与
<package id="Microsoft.AspNet.WebApi" version="5.2.3"
targetFramework="net461" />
同时拨打 One 和 Two 都抱怨 GetOne,
"Multiple actions were found that match the request: GetOne on type MyWeb.API.MyDataControllerGetOne on type MyWeb.API.MyDataController"
如果从 Api 控制器中移除 GetTwo(),它会起作用。
这看起来应用程序仍在使用 convention-based 路由。
冲突的原因是默认的convention-based路由模板api/{controller}/{id}
通常不提供这样的操作参数api/{controller}/{action}/{id}
。如果您想在使用之前提供的模板时通过 convention-routing 执行 post 操作。
如果您想使用属性路由,那么您需要在 WebApiConfig.cs
文件中启用属性路由,以允许 Rout
属性工作。
public static class WebApiConfig {
public static void Register(HttpConfiguration config) {
// Attribute routing.
config.MapHttpAttributeRoutes();
// Convention-based routing.
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
您还需要更新您的路线以获得您想要的
[RoutePrefix("MyData")]
public class MyDataController: ApiController {
//GET MyData/GetOne
[HttpGet]
[Route("GetOne")]
public IHttpActionResult GetOne() { }
//GET MyData/GetTwo
[HttpGet]
[Route("GetTwo")]
public IHttpActionResult GetTwo() { }
}
在此处阅读属性路由 Attribute Routing in ASP.NET Web API 2
这是对像我这样的传统应用开发者的额外回答:
- 将一个巨大的遗留 .aspx WebForm 应用程序从 VS 08 (.NET 2.x) 迁移到 VS 15(.NET 4.6)
- 通过添加 API 等新技术来复活。
经过挖掘,this 是最好的发现。如果您只有 Global.asax 而没有 .cs,只需将其添加到 .asax 中即可。