Routing 仅在URL的第一段上匹配的web api路由

Routing 仅在URL的第一段上匹配的web api路由,routing,asp.net-web-api,Routing,Asp.net Web Api,我希望我的ASP.NET Web API接受此请求: http://domain.com/proxy/service?id=12 并且仅在第一个/代理/部件上匹配,将其路由到此控制器操作。因此,该操作的参数将是URL的其余部分:“service?id=124” 在querystring之后,URL可以有任意数量的段(它作为代理调用多个远程服务器),但它不匹配 我想要下面这样的东西,但是不行。只要url在/proxy/part之后有多个段,它就会公平地匹配它 config.Routes.MapH

我希望我的ASP.NET Web API接受此请求:

http://domain.com/proxy/service?id=12
并且仅在第一个/代理/部件上匹配,将其路由到此控制器操作。因此,该操作的参数将是URL的其余部分:“service?id=124”

在querystring之后,URL可以有任意数量的段(它作为代理调用多个远程服务器),但它不匹配

我想要下面这样的东西,但是不行。只要url在/proxy/part之后有多个段,它就会公平地匹配它

config.Routes.MapHttpRoute(
      name: "ApiProxy",
      routeTemplate: "proxy/{resourcePath}",
      defaults: new { Controller = "Proxy", Action="Get" }
 );

我已经研究过MessageHandler,但它们会被所有请求解雇,这似乎并不理想,我希望我可以将其绑定到标准的Web Api路由中。

{resourcePath}
更改为
{*resourcePath}

更新

我忽略了您正在尝试创建代理的事实。您确实希望使用消息处理程序而不是控制器。创建路由时,可以传递一个消息处理程序,该处理程序仅在该路由匹配时应用。
通过使用messagehandler,异步代理请求更容易,而且应该比在ApicController中处理所有问题快得多。

使用{*resourcePath}等通配符似乎只解决了部分问题。这意味着它将调用正确的操作,但它只将URL的一部分作为resourcePath参数传递到操作方法中。它不喜欢带有查询字符串的URL


我必须结合使用通配符和Request.Uri来手动删除URL的其余部分。

这几乎可以工作,但它返回“service”,而不是“service?id=12”作为传递给操作方法的参数。我最后不得不在上下文中使用Request.Uri来手动删除url…不是很mvc;)啊,太酷了,我确实注意到它让查询慢了很多。我来看看MessageHandler。谢谢
config.Routes.MapHttpRoute(
      name: "ApiProxy",
      routeTemplate: "proxy/{resourcePath}",
      defaults: new { Controller = "Proxy", Action="Get" }
 );