在 Azure WebRole 上自动启动 WCF

Posted

技术标签:

【中文标题】在 Azure WebRole 上自动启动 WCF【英文标题】:AutoStart a WCF on Azure WebRole 【发布时间】:2012-11-22 03:18:59 【问题描述】:

我有一个托管在 Azure (WebRole) 上的 WCF。该 WCF 执行大量后台任务并回复一些请愿书。

问题在于,如果 WCF 长时间(10 小时或更长时间)未收到任何请求,则应用程序池将在 azure 实例上回收,并且 WCF 任务将停止。我做了一些调查,我可以启用自动启动功能,触及 machine.config,但这不是 azure deploy 的选项。

我可以在 web.config 中启用 AutoStart 或部署配置文件吗?

【问题讨论】:

【参考方案1】:

您可以在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 获得) 在 WebRole 元素下的服务定义中添加 <Runtime executionContext="elevated" />

【讨论】:

有机会对配置文件做同样的事情吗? 我的项目中没有 WebRole.cs,但我尝试在 global.asax 的 Application_Start 上执行此操作。代码引发异常:用户代码未处理 UnauthorizedAccessException。文件名:redirection.config。错误:权限不足,无法读取配置文件 只需将 WebRole.cs 文件添加到您的 Web 角色。还要确保在 WebRole 元素下的服务定义中添加以下元素 <Runtime executionContext="elevated" />。 Application_Start 是在 IIS 中运行的 Web 应用程序的一部分,您不应该从那里对 IIS 进行更改。 服务重新部署。我会等 24 小时后再给它接受 :) 这个解决方案是部分的。为了解决这个问题,请检查另一个问题:***.com/questions/14238569/…【参考方案2】:

虽然 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

【讨论】:

下次我会试试的。谢谢 这似乎有助于阻止我的网络角色在 20 分钟的活动后进入睡眠状态,但似乎无助于初始启动或角色在 29 小时后回收时的后续重新启动。然后第一次命中大约需要 50 秒。

以上是关于在 Azure WebRole 上自动启动 WCF的主要内容,如果未能解决你的问题,请参考以下文章

处理 Azure 暂存疯狂 URL

Azure:使用完整 IIS 的内部 WebRole 通信 (netTcpBinding)

csharp Azure WebRole的WebAPI控制器,可以管理需要很长时间才能完成的请求。

Alchemy Websockets:无法在 Azure 上托管服务器

WCF 安全绑定问题

WindowsAzure上把WebApp和WebService同时部署在一个WebRole中