我们正在 Azure 中的 .NET 4.8 上运行 ASP.NET MVC 5 应用程序。我设置了一个
HttpHandler
来向静态文件添加标头。它在我们没有前门的应用程序服务上运行没有问题,但在有前门的应用程序服务上,似乎 Content-Type
标头在某些文件上不一致地丢失。
唯一一致的是,如果
HttpHandler
被击中,就会出现问题(我可以将变量 ConfigHelper.IsUsingAccessControlAllowOrigin
设置为 false 以跳过添加标头,但它仍然会发生)。
由于此错误,静态文件未加载:
拒绝执行来自“https://example.com/Scripts/select2.full.js”的脚本,因为其 MIME 类型('')不可执行,并且启用了严格的 MIME 类型检查。
这是
HttpHandler
代码:
public class CorsHttpHandler : IHttpHandler
{
protected RequestContext RequestContext { get; set; }
public CorsHttpHandler() : base() { }
public CorsHttpHandler(RequestContext requestContext)
{
this.RequestContext = requestContext;
}
public void ProcessRequest(HttpContext context)
{
if (ConfigHelper.IsUsingAccessControlAllowOrigin && !context.Response.Headers.AllKeys.Any(x => x.Equals(ConfigHelper.AccessControlAllowOriginKey, StringComparison.OrdinalIgnoreCase)))
{
context.Response.AddHeader(ConfigHelper.AccessControlAllowOriginKey, ConfigHelper.WildCardAsterik);
}
}
public bool IsReusable
{
get { return false; }
}
}
我在
HttpHandler
中像这样配置了web.config
(侧边栏:我这样设置它们,因为逗号分隔的路径不起作用):
<add name="CorsHttpHandlerCss"
verb="*" path="*.css"
type="Example.Mvc.Handlers.CorsHttpHandler, Example.Mvc"
preCondition="managedHandler" />
<add name="CorsHttpHandlerJs"
verb="*" path="*.js"
type="Example.Mvc.Handlers.CorsHttpHandler, Example.Mvc"
preCondition="managedHandler" />
<add name="CorsHttpHandlerJpg"
verb="*" path="*.jpg"
type="Example.Mvc.Handlers.CorsHttpHandler, Example.Mvc"
preCondition="managedHandler" />
<add name="CorsHttpHandlerPng"
verb="*" path="*.png"
type="Example.Mvc.Handlers.CorsHttpHandler, Example.Mvc"
preCondition="managedHandler" />
解决此问题的一个选项是放弃在 C# 中设置此标头,购买 Front Door / CDN 的高级实例,然后在那里设置标头。 然而,我认为这个问题需要解决,因为人们如何在没有这个问题的情况下使用带有前门的
HttpHandler
?
发现 Azure Front Door Classic 出现此问题,但标准版从未出现此问题。我们将两者都用于我们的一种产品。
我们使用部署槽为 Azure 应用服务分配新的部署,并且 Azure 将 .js 文件缓存在单独的文件夹中,例如 u000b21js hisfile.js,虽然这是第一次转换,但如果有人偶尔访问新文件,则 mime 标头设置不正确,并且该用户被告知该缓存文件在 90 天内有效,这对他们来说是一场噩梦浏览器被告知该文件已缓存,无需获取新文件,并且缺少的 mime 标头会阻止应用程序加载,有时是整个应用程序,有时只是一个模块。