【问题标题】:A catch-all route with Web API and ASP.NET MVC?使用 Web API 和 ASP.NET MVC 的包罗万象的路线?
【发布时间】:2015-03-29 16:09:29
【问题描述】:

我正在使用 ASP.NET MVC 和 Web API 开发一个 Web 应用程序。 我需要以下映射:

http://mysite/     => Welcome page (MVC)
http://mysite/Help => Help page (MVC)
http://mysite/anything_else_here => Web API Search with "anything_else_here" param

我使用以下绑定:

// RouteConfig.cs, MVC routing        
routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", 
                 action = "Index", id = UrlParameter.Optional }

//WebApiConfig.cs
config.Routes.MapHttpRoute(
            name: "CatchAll",
            routeTemplate: "{q}",
            defaults: new { controller = "Search", action = "GetGeneric" },
            constraints: new  { q = @"\S+" }

此配置适用于所有查询,除了那些有百分比标记的查询(用于空间编码)。

例如像

这样的查询
http://mysite/shop
http://mysite/get+discount
http://mysite/redeem+code

工作正常,但是

http://mysite/shopping%20experience
http://mysite/get%20discount
http://mysite/redeem%20code

不要。相反,我收到错误 404“找不到资源”。

有什么办法可以捕捉到这些查询吗?

约束“\S+”与百分比标记匹配。

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-web-api asp.net-mvc-routing


    【解决方案1】:

    在我看来,这是设计使然。您的约束已经过测试,但仅在解码适合参数的 URL 部分之后。你的%20实际上是一个空格。

    您的加号不是编码字符,而是按字面意思处理,因此它与约束表达式的“非空白”类匹配。

    这引出了一个问题:为什么你对那条路线有限制?

    【讨论】:

    • 我需要这个约束来允许 ASP.NET MVC 路由调度程序拦截空路由(根本不提供任何内容)并向我显示渲染视图而不是调用 WebAPI 控制器。
    • 惯例是在所有 Web API 东西前加上“/api”,这样就很难混淆它们之间的路由问题。
    • 是的,我知道这个约定。问题是 Web 应用程序充当了我无法更改的企业应用程序的代理。此企业应用程序以http://endpoint/parameterstring 的形式发送请求。我在 http://endpoint/ 上托管的 Web 应用程序解析参数字符串并将预期数据返回到此应用程序,模仿原始(不再可用)服务。因此,我不能依赖路线中的任何约定。如果没有提供参数字符串,我会为用户返回一个帮助页面,其中包含有关此代理服务的说明。
    猜你喜欢
    • 2011-10-13
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多