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 文件夹的人,这里是我的解决方法:
- 使用 WinSCP 连接到 Azure Web App 的 FTP 而不是 FileZilla
- 直接创建“.well-known”
一种。请注意,该文件夹不会显示在 FTP 客户端
- 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
创建了我的文件。之后文件就可以访问了。
我正在尝试制作文件:
.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 文件夹的人,这里是我的解决方法:
- 使用 WinSCP 连接到 Azure Web App 的 FTP 而不是 FileZilla
- 直接创建“.well-known” 一种。请注意,该文件夹不会显示在 FTP 客户端
- 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
创建了我的文件。之后文件就可以访问了。