多个 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" />

同时拨打 OneTwo 都抱怨 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 中即可。