在 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
,您需要:
<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:使用完整 IIS 的内部 WebRole 通信 (netTcpBinding)
csharp Azure WebRole的WebAPI控制器,可以管理需要很长时间才能完成的请求。