我正在使用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 +”与百分比标记匹配。
答案 0 :(得分:1)
在我看来,这是设计的。您的约束经过测试,但仅在解码符合参数的URL部分后才能进行测试。您的%20
实际上是一个空格。
你的加号不是编码字符,而是按字面意思对待,因此它与“非空格”匹配。约束表达式的类。
这引出了一个问题:为什么你对这条路线有约束?