8

Azure (WebRole) でホストされている WCF があります。その WCF は多くのバックグラウンド タスクを実行し、いくつかの請願に返信します。

問題は、WCF が長期間 (10 時間以上) 要求を受信しない場合、Azure インスタンスでアプリケーション プールがリサイクルされ、WCF タスクが停止することです。Machine.config に触れて AutoStart 機能を有効にできることを少し調査しましたが、これは azure デプロイのオプションではありません。

web.config 内で AutoStart を有効にしたり、構成ファイルを展開したりできますか?

4

2 に答える 2

11

WebRole.cs にいくつかのコードを追加して、アプリケーション プールを変更できます。

public class WebRole : RoleEntryPoint
{
    public override void Run()
    {
        using (var serverManager = new ServerManager())
        {
            var mainSite = serverManager.Sites[RoleEnvironment.CurrentRoleInstance.Id + "_Web"];
            var mainApplication = mainSite.Applications["/"];
            var mainApplicationPool = serverManager.ApplicationPools[mainApplication.ApplicationPoolName];
            mainApplicationPool["autoStart"] = true;
            mainApplicationPool["startMode"] = "AlwaysRunning";

            serverManager.CommitChanges();
        }

        base.Run();
    }

    public override bool OnStart()
    {
        // For information on handling configuration changes
        // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.

        return base.OnStart();
    }
}

注:使用ServerManagerするには、次のものが必要です。

  • 参照C:\Windows\system32\inetsrv\Microsoft.Web.Administration.dll (または NuGet から入手可能)
  • <Runtime executionContext="elevated" />WebRole要素の下にサービス定義を追加します
于 2012-12-04T13:30:22.803 に答える
3

Sandrino のソリューションは機能するかもしれませんが、Web ロールを昇格されたセキュリティ モードで実行する必要がなく、Web ロールの開始時に (最初のユーザーがサイトにアクセスする前に) アプリケーションを強制的に開始するソリューションを次に示します。このソリューションは、IIS 8 の「アプリケーションの初期化」機能を必要としない古いバージョンの IIS/Windows Server でも機能します。

次のコンテンツを含む WebRole.cs を追加するだけです。

using System;
using System.Net;
using System.Net.Security;
using System.Threading;
using Microsoft.WindowsAzure.ServiceRuntime;

namespace Website
{
    public class WebRole : RoleEntryPoint
    {
        public override bool OnStart()
        {
            WarmUpWebsite("HttpIn");
            return base.OnStart();
        }

        public override void Run()
        {
            while (true)
            {
                WarmUpWebsite("HttpIn");
                Thread.Sleep(TimeSpan.FromMinutes(1));
            }
        }

        public void WarmUpWebsite(string endpointName)
        {
            // Disable check for valid certificate. On som sites live HTTP request are redirected to HTTPS endpoint. And when running on staging SSL the certificate is invalid.
            RemoteCertificateValidationCallback allowAllCertificatesCallback = (sender, certificate, chain, sslPolicyErrors) => true;
            ServicePointManager.ServerCertificateValidationCallback += allowAllCertificatesCallback;
            try
            {
                RoleInstanceEndpoint endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints[endpointName];

                string address = String.Format("{0}://{1}:{2}", endpoint.Protocol, endpoint.IPEndpoint.Address, endpoint.IPEndpoint.Port);

                //This will cause Application_Start in global.asax to run
                new WebClient().DownloadString(address);
            }
            catch (Exception)
            {
                // intentionally swallow all exceptions here.
            }
            ServicePointManager.ServerCertificateValidationCallback -= allowAllCertificatesCallback;
        }
    }
}

クレジット: http://weblogs.thinktecture.com/cweyer/2011/01/poor-mans-approach-to-application-pool-warm-up-for-iis-in-a-windows-azure-web- role.html

while(true) を Sandrino のアプローチに置き換えるか、アプリケーション プールのアイドル タイムアウトを無効にすることができます: http://blog.smarx.com/posts/controlling-application-pool-idle-timeouts-in-windows-azure

于 2014-03-16T17:25:48.833 に答える