在我的www网站中,我在RouteConfig.cs文件中有代码来强制ASP.NET包含"www":
using Canonicalize;
using System.Configuration;
using System.Web.Routing;
namespace MyWebsite
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
if (ConfigurationManager.AppSettings["Production"] == "true")
{
routes.Canonicalize().Www();
}
}
}
}我在Azure托管我的网站,它有“部署槽”。我将我的代码推到“暂存”槽中,测试,然后将“暂存”槽与“生产”槽“交换”。
在上面的代码中,您可以看到我有条件地只为生产插槽包含了routes.Canonicalize().Www();。这是因为暂存槽使用的URL不允许“www”。
问题是,RouteConfig.cs文件中的代码似乎只在初始网站加载时触发。当我加载网站时,RouteConfig.cs被执行,routes.Canonicalize().Www();被正确排除。当我交换插槽时,RouteConfig.cs代码似乎没有被重新执行,并且routes.Canonicalize().Www();仍然被排除在外,这不是我想要的。
有没有一种方法可以可靠而准确地将routes.Canonicalize().Www();仅包含在生产插槽中?
发布于 2019-06-12 16:41:56
我建议你在这个场景中使用应用程序初始化模块,在这个场景中你可以调用你的函数来添加routes.Canonicalize().Www()。应用程序初始化模块已经实现,可以在部署插槽之间交换内容时使用。此模块还针对所有其他操作(例如自动缩放、手动缩放或Azure fabric维护)进行了实现,其中提供了新的worker。也就是说,您可以在应用程序可用之前主动执行初始化任务。
为了启用上述模块,您需要创建一个applicationInitialization部分,您将在其中定义初始化任务开始时要命中的url。您还可以选择指定用于预热请求的hostName,这可能对调试和监视非常有帮助。如果没有指定,将使用“localhost”作为主机名。
<system.webServer>
<applicationInitialization>
<add initializationPage="/app/initialize" hostName="warmup-requests.domain.com"/>
</applicationInitialization>
<system.webServer>执行完“app/initialize”url下的代码后,将完成部署槽之间的交换操作。
参考资料:
https://ruslany.net/2015/09/how-to-warm-up-azure-web-app-during-deployment-slots-swap/ https://feedback.azure.com/forums/169385-web-apps/suggestions/6972595-application-initialization-to-warm-up-specific-pag
希望能有所帮助。
https://stackoverflow.com/questions/56547371
复制相似问题