ASP.NET如何配置支持支付回调请求MIME类型解决406报错
错误原因分析
406错误触发的核心原因是IIS静态文件处理模块校验请求MIME类型时不匹配:
- 你之前添加的
.json后缀MIME映射仅对请求路径以.json结尾的接口生效,如果你的回调路由是无扩展名的地址,该配置不会生效 - 支付服务商的请求头未携带
Accept字段,IIS默认校验规则无法匹配到支持的MIME类型,直接拦截请求
可行解决方案
方案1:修改web.config全局配置(推荐)
直接调整IIS的静态文件处理规则,适配无扩展名的路由请求,在web.config的<configuration>节点下添加如下配置:
<system.webServer> <staticContent> <!-- 移除原有配置避免重复报错 --> <remove fileExtension=".json" /> <remove fileExtension="." /> <remove fileExtension=".*" /> <!-- 配置json后缀映射 --> <mimeMap fileExtension=".json" mimeType="application/json" /> <!-- 配置无扩展名请求的MIME映射,适配路由接口 --> <mimeMap fileExtension="." mimeType="application/json" /> <mimeMap fileExtension=".*" mimeType="application/octet-stream" /> </staticContent> <!-- 调整静态文件处理逻辑,允许POST请求通过 --> <handlers> <remove name="StaticFile" /> <add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" /> </handlers> </system.webServer>
方案2:Global.asax添加请求预处理
如果你不想修改全局IIS配置,可以在Global.asax的Application_BeginRequest方法中手动处理回调请求的头信息,绕过校验:
protected void Application_BeginRequest(object sender, EventArgs e) { // 将路径替换为你实际的支付回调地址 if (Request.Url.AbsolutePath.StartsWith("/pay/callback")) { // 手动补全Accept头,适配支付请求 if (Request.Headers["Accept"] == null) { Request.Headers.Add("Accept", "application/json, text/plain, */*"); } } }
方案3:调整回调路由后缀
直接将你的回调路由地址修改为以.json结尾,比如原地址/pay/callback改为/pay/callback.json,你之前添加的.json MIME映射就会生效,无需其他额外配置。
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

