.NET Framework ApiController请求无/带.参数报404,求解决方案
解决.NET Framework ApiController带点参数无尾斜杠404的问题
问题背景
当请求路径参数包含.(比如api/v1/users/some.text)且末尾无/时返回404,带/或参数无.时正常,路由定义为[Route("api/v1/users/{email}")]。
可行的服务端配置方案
1. 为路由参数添加正则约束
直接在属性路由的参数上指定正则约束,允许参数包含点号:
[Route("api/v1/users/{email:regex(^.*$)}")] [System.Web.Http.HttpGet] public object GetUserByEmail(string email)
如果是使用全局路由配置,在WebApiConfig.cs的Register方法中修改路由约束:
config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional }, constraints: new { id = @"^.*$" } // 允许任意字符,包括点号 );
2. 强制所有请求走ASP.NET管道
IIS默认会把带点号的路径识别为静态文件,跳过ASP.NET处理。在web.config中添加配置让所有请求都经过托管模块:
<system.webServer> <modules runAllManagedModulesForAllRequests="true" /> </system.webServer>
也可以针对API路径做精准配置:
<system.webServer> <handlers> <add name="ApiRequestHandler" path="api/*" verb="GET,HEAD,POST,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> </handlers> </system.webServer>
3. 用URL重写修正请求路径
通过IIS URL重写模块,将带点号且无尾斜杠的请求重写为可被路由识别的格式:
<system.webServer> <rewrite> <rules> <rule name="Rewrite dotted paths" stopProcessing="true"> <match url="^api/v1/users/([^/]+)\.([^/]+)$" /> <action type="Rewrite" url="api/v1/users/{R:1}.{R:2}/" /> </rule> </rules> </rewrite> </system.webServer>
4. 启用双重转义解析
在web.config中开启允许双重转义,确保包含特殊字符的参数能被正确解析:
<system.webServer> <security> <requestFiltering allowDoubleEscaping="true" /> </security> </system.webServer>
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

