You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求MVC控制器方法时生成Globalization自定义区域文件并返回404

解决Windows Server 2016上ASP.NET MVC请求404且生成.nlp文件的问题

我之前处理过类似的部署问题,这个情况的核心是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,检查三点:

  1. 不再生成新的.nlp文件
  2. 请求返回正常响应而非404
  3. IIS日志中显示正确的控制器和操作名称,无截断情况

内容的提问来源于stack exchange,提问作者tidmutt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:52:52