【问题标题】:web api route to only match on first segment of URLweb api 路由仅匹配 URL 的第一段
【发布时间】:2013-04-30 09:23:06
【问题描述】:

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

http://domain.com/proxy/service?id=12

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

public string Get(string url)
{
    //Calls external resource and returns response
}

在查询字符串之后,url 可以有任意数量的段(它作为代理调用多个远程服务器),但不会匹配。

我想要下面这样的东西,但它不起作用。只要 url 在 /proxy/ 部分之后有多个段,它就会匹配它。

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

我正在研究 MessageHandlers,但它们会因所有请求而被触发,这似乎并不理想,我希望我可以将它与标准 Web Api 路由联系起来。

【问题讨论】:

    标签: routing asp.net-web-api


    【解决方案1】:

    {resourcePath} 更改为{*resourcePath}

    更新

    我错过了您正在尝试创建代理的事实。您真的想为此使用消息处理程序而不是控制器。创建路由时,您可以传递仅在匹配该路由时应用的消息处理程序。 通过使用消息处理程序,可以更轻松地异步代理请求,并且应该比通过 ApiController 中的所有 goop 快得多。

    【讨论】:

    • 这几乎可以工作,但它返回“service”,而不是“service?id=12”作为传递给 Action 方法的参数。我最终不得不在上下文中使用 Request.Uri 来手动删除 url...不是 mvc ;)
    • 啊酷,我确实注意到它使查询速度变慢了很多。我会看看MessageHandler。谢谢。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-05
      • 2015-07-22
      • 1970-01-01
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      • 2021-03-01
      • 1970-01-01
      相关资源
      最近更新 更多