4

最近,我在我们的一个 Azure 项目中实施了应用程序初始化,以最大限度地减少每个站点预热所需的时间。

我基本上已经完全按照这篇博文中概述的步骤实现了。

在全新部署中,它适用于我在 IIS 中的所有 10 个站点。但是,问题是,当我尝试升级该部署时,每个站点的前 25 个请求左右出现 500 个错误。

现在,这并不理想,因为不是在部署后对每个站点进行一次热身,而是在超过 500 次之前我必须加载每个站点大约 25 次。但它们并没有就此停止,它们似乎偶尔会发生。

如果我在部署后重新映像机器,则可以解决问题。但是,以停机为代价,这不是一个选择。

有任何想法吗?

我有以下内容:

ServiceDefinition.csdef 中的启动任务来开启应用程序初始化模块:

<Task commandLine="enableApplicationInitializationIIS.cmd" executionContext="elevated"></Task>

然后在该任务中我有:

PKGMGR.EXE /iu:IIS-ApplicationInit

在 ServiceConfiguration.csfg 我设置了最新的osFamily

<ServiceConfiguration serviceName="Foo" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="3" osVersion="*" schemaVersion="2012-10.1.8">

然后在 Web 角色中,我有以下打开所有应用程序初始化所需的设置:

public class WebRole : RoleEntryPoint
{
    public override bool OnStart()
    {
        using (var serverManager = new ServerManager())
        {
            foreach (var site in serverManager.Sites)
            {
                foreach (var application in site.Applications)
                {
                    application["preloadEnabled"] = true;
                }

                site.ServerAutoStart = true;
            }

            serverManager.ApplicationPoolDefaults.ProcessModel.IdleTimeout = new TimeSpan(00, 00, 00);
            serverManager.ApplicationPoolDefaults.Recycling.PeriodicRestart.Time = new TimeSpan(00, 00, 00);
            serverManager.ApplicationPoolDefaults["startMode"] = "AlwaysRunning";

            foreach (var appPool in serverManager.ApplicationPools)
            {
                appPool["startMode"] = "AlwaysRunning";
            }

            serverManager.CommitChanges();
        }

        return true;
    }
}

最后,我的每个网站都有以下内容:

<system.webServer>
    <applicationInitialization skipManagedModules="true">
        <add initializationPage="/" />
    </applicationInitialization>
</system.webServer>

不知道skipManagedModules是什么?

4

1 回答 1

2

我遇到了类似的问题并找到了您的帖子。在我的情况下,这个问题已经存在于初始部署和升级部署中。

在我的错误日志中,我发现“值不能为空”异常。似乎 ServerManager 无法初始化 - using 语句中的代码未执行。结果我试图将程序集 Microsoft.Web.Administration(来自 Windows 7)部署到 Windows Server 2012 机器上。

应用正确的版本后,500 错误消失了。

System.TypeInitializationException: The type initializer for 'Microsoft.Web.Administration.ConfigurationManager' threw an exception. 
System.ArgumentNullException: Value cannot be null.
at System.Activator.CreateInstance(Type type, Boolean nonPublic)
at System.Activator.CreateInstance(Type type)
at Microsoft.Web.Administration.ConfigurationManager..cctor()
--- End of inner exception stack trace ---
at Microsoft.Web.Administration.ConfigurationManager..ctor(ServerManager owner, String applicationHostConfigurationPath)
at Microsoft.Web.Administration.ServerManager..ctor(String applicationHostConfigurationPath)

编辑:

我在初始化时继续遇到 500 错误,这似乎是由于 2 个标签而发生的:

<applicationInitialization remapManagedRequestsTo="app_starting.htm" skipManagedModules="true" >
    <add initializationPage="/" />
</applicationInitialization>

删除 remapManagedRequestsTo 和 skipManagedModules 属性似乎可以删除 500 错误,请参阅IIS 7.5 Application Initialization for ASP.NET web service (warmup) without remapping requests

于 2013-11-22T17:46:52.247 回答