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

ASP.NET Core 6部署Azure App Service遇.dd结尾URL路由404问题

问题根因

这个问题和ASP.NET Core代码逻辑无关,是Azure App Service Windows宿主前端的IIS反向代理层默认拦截规则导致的:
本地开发时直接通过Kestrel运行项目,所有请求直接进入应用路由管线,所以所有路径都能正常响应。部署到Azure App Service(Windows计划)时,平台默认用IIS做反向代理,请求会先经过IIS的处理逻辑再转发给应用,IIS默认有两个规则会提前拦截请求:

  • 静态文件优先匹配:如果请求路径的后缀在IIS已注册的MIME静态文件映射列表里,IIS会先去站点物理目录下查找对应文件,找不到就直接返回404,不会把请求转发给Kestrel
  • 旧版8.3短文件名兼容逻辑:当路径最后一段符合单个任意字符 + 点 + 2个任意字符的格式时,IIS会触发Windows文件系统的短文件名匹配逻辑,直接查找物理文件,查找失败直接返回404,不进入后续转发流程

你访问的/resources/d.dd刚好同时命中两个规则:.dd在Azure App Service默认IIS的MIME映射列表中,且路径最后一段完全符合短文件名格式,所以请求根本没到你的应用,直接被IIS返回了默认404页。
你测试的其他路径不触发问题的原因完全对应规则:

  • 带末尾斜杠的/resources/d.dd/:路径最后一段为空,不触发文件匹配逻辑
  • 后缀为.vn等其他顶级域后缀:不在默认MIME静态映射列表里,IIS直接放行转发
  • 前缀更长的/resources/hello.dd:不符合短文件名1字符前缀的格式要求,不触发短名校验
  • 后缀3个字符的/resources/d.ddd、/resources/d.txt:不满足2字符后缀的短名校验规则,IIS正常转发
解决方法

按优先级从高到低选择方案即可:

方案1:配置web.config让所有请求由ASP.NET Core接管(推荐)

Web API项目不需要IIS处理静态文件,直接让ANCM(ASP.NET Core Module)接管所有请求是最彻底的解决方式,后续也不会再遇到其他后缀被拦截的问题。
在项目根目录创建或修改已有的web.config文件,写入如下配置:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <!-- 移除默认静态文件、目录浏览处理器 -->
      <remove name="StaticFile" />
      <remove name="DirectoryBrowse" />
      <!-- 配置ANCM处理所有请求 -->
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
    </handlers>
    <!-- 替换成你自己的项目入口dll名称 -->
    <aspNetCore processPath="dotnet" arguments=".\YourProject.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
    <security>
      <requestFiltering>
        <!-- 清空后缀拦截规则,允许所有后缀的请求 -->
        <fileExtensions allowUnlisted="true" applyToWebDAV="false">
          <clear />
        </fileExtensions>
      </requestFiltering>
    </security>
  </system.webServer>
</configuration>

将该文件随项目发布到Azure App Service后即可生效。

方案2:单独映射.dd后缀,保留IIS静态文件能力

如果你需要IIS处理站点下的静态资源,可以只针对.dd后缀做配置覆盖,在web.config的<system.webServer>节点下添加如下内容:

<staticContent>
  <!-- 先移除默认的.dd后缀映射避免重复添加报错 -->
  <remove fileExtension=".dd" />
  <!-- 重新配置后缀映射,不触发静态文件查找拦截 -->
  <mimeMap fileExtension=".dd" mimeType="application/octet-stream" />
</staticContent>

方案3:调整路由规则规避拦截

如果不想修改服务器配置,也可以调整端点路由格式,比如在id参数段后增加固定后缀、强制要求末尾斜杠等,但这种属于临时规避方案,后续遇到其他符合规则的路径还是可能出问题,不推荐使用。

验证方式

发布完成后可以直接访问/resources/d.dd测试,也可以通过响应头判断:如果响应头中存在Server: Kestrel字段,说明请求已经成功转发到你的应用,不会再出现IIS默认的404提示。

内容的提问来源于stack exchange,提问作者Thai Anh Duc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:36:22