请求MVC控制器方法时生成Globalization自定义区域文件并返回404
我之前处理过类似的部署问题,这个情况的核心是IIS的请求解析逻辑误把URL中的ads-service当成了语言区域标识,而非控制器名称的一部分,导致它触发了全球化资源文件的生成(也就是ads-service.nlp),同时错误截断了控制器路径,最终返回404状态码。
为什么会生成.nlp文件?
Windows的全球化组件在尝试识别请求的语言区域时,如果找不到匹配的系统区域包,就会自动生成对应的.nlp文件作为缓存。这里IIS错误地将URL中的ads-service解析成了类似en-US的区域格式,才触发了这个不必要的行为。
问题根源:URL路由与IIS区域解析的优先级冲突
ASP.NET MVC默认路由规则是{controller}/{action}/{id},但IIS的区域识别模块或者默认的URL解析逻辑可能优先拦截了请求,把ads-service当成了区域前缀,跳过了MVC的路由处理。
具体解决步骤:
禁用IIS自动区域识别
可以通过Web.config强制指定网站默认语言,避免IIS自动解析URL中的区域:<system.web> <globalization culture="zh-CN" uiCulture="zh-CN" /> <!-- 替换为你的网站默认语言 --> </system.web>或者在IIS管理器中给网站添加
Content-Language响应头,值设为默认语言。调整MVC路由规则与约束
确保路由配置明确匹配控制器格式,避免被误解析。在RouteConfig.cs中修改路由:routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, constraints: new { controller = @"^[a-zA-Z0-9_-]+$" } // 明确控制器名称的合法格式 );另外注意:ASP.NET MVC默认会把
ads-service映射为AdsServiceController(连字符转驼峰),如果你的控制器名称不符合这个规则,需要单独配置路由映射。调整IIS模块加载顺序
确保ASP.NET路由模块优先于IIS区域识别模块处理请求,在Web.config中修改模块顺序:<system.webServer> <modules runAllManagedModulesForAllRequests="true"> <remove name="UrlRoutingModule-4.0" /> <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" /> </modules> </system.webServer>清理已生成的缓存文件
手动删除C:\Windows\Globalization下的ads-service.nlp文件,避免后续请求触发错误缓存。
验证方法
修改配置后重新请求目标URL,检查三点:
- 不再生成新的
.nlp文件 - 请求返回正常响应而非404
- IIS日志中显示正确的控制器和操作名称,无截断情况
内容的提问来源于stack exchange,提问作者tidmutt

