Asp.net Web Api路由限制?

Asp.net Web Api路由限制?,asp.net,asp.net-web-api,routing,Asp.net,Asp.net Web Api,Routing,假设我在Api控制器中有以下两个操作: [HttpGet] public Product ProductById(int id) { ... return item; } [HttpGet] public string ProductByString(string st) { return "String Result"; } 我还有这两条路线: config.Routes.MapH

假设我在Api控制器中有以下两个操作:

    [HttpGet]
    public Product ProductById(int id)
    {
      ...
        return item;
    }

    [HttpGet]
    public string ProductByString(string st)
    {
        return "String Result";
    }
我还有这两条路线:

 config.Routes.MapHttpRoute("DefaultApi",
                "api/{controller}/{id}",
                new
                {
                        id = RouteParameter.Optional
                });

  config.Routes.MapHttpRoute("DefaultApi2", "api/{controller}/{st}");
正在运行
http://mysite:9000/api/products/1
将起作用

它将赶上第一条路线,因为有比赛

如果我想要字符串操作版本,我必须执行以下操作:

http://mysite:9000/api/products/?st=blabla
这将同时使用第一条路线。(查询字符串不匹配路由)

如果交换路由,则只命中DefaultApi2路由。(我确实理解为什么会发生这种情况)

所以我的结论是,我永远无法同时做到这两件事:

http://mysite:9000/api/products/1

http://mysite:9000/api/products/Guitar

换言之,第二条路线永远不会匹配

问题

此外

  • 在路由中提及
    {action}
    名称(不推荐,web Api约定)
  • 使用路由属性(我不使用webApi 2)

解决这个问题的正确方法是什么?我可以看出它是多么复杂(我必须记住:只有int-ID有
x/y/ID
的东西,对于其他人,我必须使用querystring等…我很容易迷路-在一个大的应用程序中)

我想它可以通过三种途径修复:

config.Routes.MapHttpRoute("DefaultApi",
               "api/{controller}/{id}",
               contraint: new { id = @"\d+" }
               );
// only matches numeric id's

config.Routes.MapHttpRoute("DefaultApi2", "api/{controller}/{st}");
// only matches having a parameter, no matter what data type

config.Routes.MapHttpRoute("DefaultApi3",
               "api/{controller}/{id}",
               new
               {
                       id = RouteParameter.Optional
               });
// matches the empty id

默认web API只为form方法提供一个方法。你为什么不在你的api里面检查一下你得到了什么?@hȇkhaṝ 它是如何联系的?web api首先匹配一个路由,然后找到一个控制器,然后(根据方法)-选择all by prefeix或ATTR,然后按参数进行匹配。我不明白你的评论有什么关系……(或者我没有领会你的意思吗?)你的意思是:。@patrickhoffman Close,但不一样。在他的回答中,他增加了另一个层次的路由。我没有其他水平。在我想使用Int/StringYup的同一级别中,我考虑了约束条件:-)我认为这是正确的方向。(删除了注释)-当
api/products/
提供所有信息时,需要路由#3。所以你是对的,整个层次结构很容易出错。在一个大型应用程序中你会怎么做?我正在模拟一个场景,在这个场景中,我有很多路线,我需要添加另一条路线-我想我必须一条一条地走,看看哪里不会把事情搞砸……我说得对吗?我应该这样做吗?我想你需要更高级的路由。我还没有使用WebAPI,只是MVC,我只是每个操作有一个自定义的路由名称(尽管是基于通用方法)。我认为没有属性路由就没有很好的解决方案。你能用3个不同的示例来详细说明每个操作的自定义路由名称吗?(哦……你是说路线上的行动吗?)