我希望我的ASP.NET Web API接受此请求:
http://domain.com/proxy/service?id=12
并且仅匹配第一个/ proxy / part,将其路由到此控制器操作。因此,action的参数将是URL的其余部分:“service?id = 124”
public string Get(string url)
{
//Calls external resource and returns response
}
在查询字符串之后,url可以有任意数量的段(它作为调用几个远程服务器的代理),但它不匹配。
我想在下面这样的东西,但它不起作用。一旦url在/ proxy / part之后有多个段,它就会与它匹配。
config.Routes.MapHttpRoute(
name: "ApiProxy",
routeTemplate: "proxy/{resourcePath}",
defaults: new { Controller = "Proxy", Action="Get" }
);
我已经研究过MessageHandlers,但是它们会被所有请求解雇,这看起来并不理想,并且希望我可以将它绑定到标准的Web Api路由中。
答案 0 :(得分:2)
将{resourcePath}
更改为{*resourcePath}
<强>更新强>
我错过了您正在尝试创建代理的事实。你真的想为它而不是控制器使用消息处理程序。创建路由时,可以传递仅在匹配该路由时应用的消息处理程序。 通过使用messagehandler,可以更容易地异步代理请求,它应该比通过ApiController中的所有goop快得多。
答案 1 :(得分:0)
使用{* resourcePath}之类的通配符似乎只能解决部分问题。这意味着它会调用正确的Action,但它只会将部分URL作为resourcePath参数传递给Action方法。它不喜欢带有查询字符串的Urls。
我必须将通配符与Request.Uri结合使用,以手动删除其余的URL。