使用Web API和ASP.NET MVC的全能路由?

时间:2015-03-12 05:49:04

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

我正在使用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+" }

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

E.g。像

这样的查询
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 +”与百分比标记匹配。

1 个答案:

答案 0 :(得分:1)

在我看来,这是设计的。您的约束经过测试,但仅在解码符合参数的URL部分后才能进行测试。您的%20实际上是一个空格。

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

这引出了一个问题:为什么你对这条路线有约束?