Azure 网站 .well-known 路由变得不可访问

Azure websites .well-known route becomes inaccessible

我正在尝试制作文件:

.well-known/apple-developer-merchantid-domain-association

可通过我的 Azure 网站访问。我已将其添加到路由配置中:

routes.MapRoute(
    name: "ApplePay-MacOS",
    url: ".well-known/apple-developer-merchantid-domain-association",
    defaults: new { controller = "Home", action = "WellKnownApplePay" });

它指向发出文件的控制器操作。

现在,当我在本地 IIS 和 IIS Express 上测试它时,一切正常,但是当我将它上传到 Azure 时,它​​只是不接受点“。” URL 中的字符。如果我删除它,它就会工作,并且文件会在发布到 Azure 后下载。我需要它与点一起使用,因为那是 apple Pay 对我的网站的要求。

我能够使用不同的方法解决这个问题。我不再尝试为证书编写路由,而是根据 Peter Hahndorf 的回答在目录中添加了一个 web.config:IIS: How to serve a file without extension?

<?xml version="1.0" encoding="UTF-8"?>
 <configuration>
     <system.webServer>
         <staticContent>
             <mimeMap fileExtension="." mimeType="text/xml" />
         </staticContent>
     </system.webServer>
 </configuration>

我找到答案了!感谢汤姆的回答。

您确实可以将 mimemap 添加到网络配置中来解决问题。但不是放置 mimeType="text/xml" 你需要使用 mimeType="application/octet-stream" 来提供原始 apple-developer-merchantid-domain-association 文件而不是将其作为文本提供(服务器不想做)。

所以答案是将其添加到 webconfig 中的 system.webserver 节点:

<staticContent>
    <mimeMap fileExtension="." mimeType="application/octet-stream" />
</staticContent>

如其他答案中所述,问题在于 IIS 处理带有 .在他们里面。

我通过编写一个像这样注册的 IHttpHandler 在 ASP.NET MVC 中解决了这个问题:

<system.webServer>
  <handlers>
    <add name="ApplePayMerchantIdDomainAssociation" path=".well-known/apple-developer-merchantid-domain-association" verb="GET" type="MyNamespace.ApplePayMerchantIdDomainAssociationHandler, MyAssembly" resourceType="Unspecified" preCondition="integratedMode" />
  </handlers>
</system.webServer>

随后的处理方式与此类似:

使用 System.Globalization; 使用 System.Web; 使用 System.Web.Mvc;

namespace MyNamespace
{
    public class ApplePayMerchantIdDomainAssociation : IHttpHandler
    {
        public bool IsReusable => true;

        public void ProcessRequest(HttpContext context)
        {
            var wrapper = new HttpContextWrapper(context);
            ProcessRequest(wrapper);
        }

        public void ProcessRequest(HttpContextBase context)
        {
            var type = GetType();
            var assembly = type.Assembly;

            string resourceName = string.Format(
                CultureInfo.InvariantCulture,
                "{0}.apple-developer-merchantid-domain-association",
                type.Namespace);

            using (var stream = assembly.GetManifestResourceStream(resourceName))
            {
                if (stream == null)
                {
                    context.Response.StatusCode = 404;
                }
                else
                {
                    stream.CopyTo(context.Response.OutputStream);

                    context.Response.ContentType = "text/plain";
                    context.Response.StatusCode = 200;
                }
            }
        }
    }
}

在 ASP.NET 中,核心内容要早得多,因为您可以直接从 wwwroot 将其作为静态内容提供。

对于那些来这里尝试在 Azure Web Apps 中创建 .well-known 文件夹的人,这里是我的解决方法:

  1. 使用 WinSCP 连接到 Azure Web App 的 FTP 而不是 FileZilla
  2. 直接创建“.well-known” 一种。请注意,该文件夹不会显示在 FTP 客户端
  3. Select WinSCP 中的“转到”选项(右键单击空白 space 或使用 FTP 侧的工具栏)通过键入路径在文件夹内导航:/site/wwwroot/.众所周知
我的问题

我想向我的 Azure 应用服务(Linux 上的 Web 应用)添加一个 .well-known/something.json 文件以进行域验证。但是,虽然我可以在本地 (localhost) 访问该文件,但当我尝试在生产环境中访问该文件时,我得到了 404 File Not Found

我发现在我的项目 wwwroot/.well-known/something.json 下的文件在部署过程中没有上传到 Azure(C# ASP.NET 核心,Visual Studio 2019)。

我的解决方案

在我的 Azure App Service 资源中,我使用 Advanced Tools 项来访问 Kudu 容器。在那里,我使用 bash 控制台导航到我站点的 wwwroot 目录:cd site/wwwroot/wwwroot/。我创建了众所周知的文件夹 mkdir .well-known,在其中导航 cd .well-known,然后使用 vi something.json 创建了我的文件。之后文件就可以访问了。