多个GET没有好的w /属性路由?

时间:2017-02-08 01:46:39

标签: c# asp.net-web-api asp.net-web-api-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'})... 

this post相同,API版本

<package id="Microsoft.AspNet.WebApi" version="5.2.3"
targetFramework="net461" />

致电一个两个抱怨 GetOne

  

&#34;找到了与请求匹配的多个操作:GetOne类型   MyWeb.API.MyDataControllerGetOne类型   MyWeb.API.MyDataController&#34;

如果从Api控制器中删除GetTwo(),它会起作用。

2 个答案:

答案 0 :(得分:1)

这看起来应用程序仍在使用基于约定的路由。

冲突的原因是因为默认的基于约定的路由模板api/{controller}/{id}通常不提供像此api/{controller}/{action}/{id}这样的操作参数。如果您希望在使用之前提供的模板时通过约定路由获得后期操作。

如果您想使用属性路由,则需要在WebApiConfig.cs文件中启用属性路由,以便Rout Atrribute能够正常工作。

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

答案 1 :(得分:0)

对于像我这样的传统应用开发者来说,这是另一个答案:

  • 将一个巨大的遗留.aspx WebForm应用程序从VS 08(.NET 2.x)迁移到VS. 15(.NET 4.6)
  • 通过添加API等新技术来恢复活力。

在挖掘之后,this是最好的发现。如果您只有没有.cs的Global.asax,只需将其添加到.asax即可。