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

Hosted Blazor无法提供wwwroot中Apple Pay验证文件的问题求助

.NET Core集成Stripe时Apple Pay验证文件访问问题解决方案

先排查基础问题

先确认两件事:

  • 验证文件名完全是apple-developer-merchantid-domain-association,无任何后缀,且确实放在wwwroot/.well-known/目录下;
  • 若部署在Linux类服务器,注意文件名大小写(Windows不区分,但Linux严格区分)。

如果以上没问题,试试下面的方案:

方案1:配置静态文件中间件支持无后缀文件

.NET Core静态文件中间件默认不识别无后缀文件的MIME类型,会导致访问失败。在Program.cs里添加配置:

var builder = WebApplication.CreateBuilder(args);

// 配置静态文件的MIME类型映射
builder.Services.Configure<StaticFileOptions>(options =>
{
    options.OnPrepareResponse = ctx =>
    {
        if (ctx.File.Name.Equals("apple-developer-merchantid-domain-association", StringComparison.OrdinalIgnoreCase))
        {
            ctx.Context.Response.ContentType = "text/plain";
        }
    };
});

var app = builder.Build();

// 确保静态文件中间件在路由之前执行
app.UseStaticFiles();

// 其他中间件(路由、认证等)配置...
app.Run();

方案2:用控制器返回文件并隐藏控制器路径

如果静态文件方式不行,直接写个控制器动作,给它配置自定义路由,让路径完全符合Apple的要求:

[ApiController]
public class ApplePayVerificationController : ControllerBase
{
    private readonly IWebHostEnvironment _webHostEnv;

    public ApplePayVerificationController(IWebHostEnvironment webHostEnv)
    {
        _webHostEnv = webHostEnv;
    }

    // 直接把路由设为要求的地址,完全看不到控制器名称
    [HttpGet("/.well-known/apple-developer-merchantid-domain-association")]
    public IActionResult GetVerificationFile()
    {
        var filePath = Path.Combine(_webHostEnv.WebRootPath, ".well-known", "apple-developer-merchantid-domain-association");
        
        if (!System.IO.File.Exists(filePath))
        {
            return NotFound();
        }

        return PhysicalFile(filePath, "text/plain");
    }
}

访问要求的URL时,会直接命中这个动作返回文件,路径里不会出现控制器名称。

方案3:用URL重写强制返回文件

如果上面两种方式都不生效,试试用URL重写中间件直接处理请求:

var app = builder.Build();

// 添加URL重写规则
var rewriteOptions = new RewriteOptions();
rewriteOptions.Add(context =>
{
    var request = context.HttpContext.Request;
    if (request.Path.Equals("/.well-known/apple-developer-merchantid-domain-association", StringComparison.OrdinalIgnoreCase))
    {
        var filePath = Path.Combine(app.Environment.WebRootPath, ".well-known", "apple-developer-merchantid-domain-association");
        context.HttpContext.Response.ContentType = "text/plain";
        context.HttpContext.Response.SendFileAsync(filePath);
        return Task.CompletedTask;
    }
    return Task.CompletedTask;
});

app.UseRewriter(rewriteOptions);
app.UseStaticFiles();

// 其他配置...
app.Run();

托管环境额外检查

如果部署在第三方托管平台(比如IIS、Nginx、Azure App Service):

  • IIS:在web.config里添加MIME类型映射,允许无后缀文件访问;
  • Nginx:在站点配置里添加location规则,指定返回该文件并设置Content-Type: text/plain;
  • Azure App Service:在门户的「配置」->「MIME类型」中添加无后缀文件的映射。

内容的提问来源于stack exchange,提问作者David.Warwick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 11:37:27