首页 > 解决方案 > 强制 MVC RouteConfig 执行?

问题描述

在我的 ASP.NET MVC 网站中,我在RouteConfig.cs文件中有代码强制 URL 包含“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();仅包含在生产槽中?

标签: c#asp.net-mvcazureroutingcanonical-link

解决方案


我建议您在这种情况下使用应用程序初始化模块,您可以在其中调用函数来添加routes.Canonicalize().Www(). 应用程序初始化模块已实现并可在您在部署槽之间交换内容时使用。此模块还针对预配新工作器的所有其他操作(例如自动缩放、手动缩放或 Azure 结构维护)实施。也就是说,您可以在应用程序可用之前主动执行初始化任务。

为了启用上述模块,您需要创建一个 applicationInitialization 部分,您应在其中定义要启动初始化任务的 url。您还可以选择指定用于热身请求的主机名,这可能对调试和监控目的非常有帮助。如果没有另外指定,“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-应用程序/建议/6972595-application-initialization-to-warm-up-specific-pag

希望能帮助到你。


推荐阅读