我在azure上有一个web角色,我想在不等待第一个请求的情况下强制执行Application_Start。
我设法在我的网站上将“自动启动”属性设置为true
AutoStart a WCF on Azure WebRole
但是,在第一个请求到来之前,不会调用Application_Start。
我不确切地知道我是否遗漏了一些重要的东西。服务器是W2008 R2,IIS版本是7.5
谢谢!
解
我把解决方案代码放在这里。我希望能帮助别人。我刚刚添加了一个WebRole.cs,只需将该代码放入每30秒执行一次ping操作。请netice我正在浏览Service.svc,因为这是我的端点,你的端点可能是另一个端点。请注意,我要求“Endpoint1”。如果您有多个端点,则应该查看该行。
public class WebRole : RoleEntryPoint
{
public override void Run()
{
var localuri = new Uri( string.Format( "http://{0}/Service.svc", RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"].IPEndpoint ) );
while (true)
{
try
{
var request = (HttpWebRequest)WebRequest.Create(localuri);
request.Method = "GET";
var response = request.GetResponse();
}
catch { }
System.Threading.Thread.Sleep(30000);
}
}
public override bool OnStart()
{
return base.OnStart();
}
}
答案 0 :(得分:3)
IIS只会在第一个请求到达时启动。解决方法是从OnStart
或您的RoleEntryPoint
后代向同一个VM发送HTTP请求 - 使用WebRequest
或同等类很容易。
答案 1 :(得分:1)
基于我的测试,当WebApp的第一个请求ISS时,仅调用Application_Start()。 (如果你尝试在Debug中启动VS而不打开任何页面(参见proj / debug中的选项),你会看到如果你不在Azure中运行WebApp也不会调用Application_Start())
我想你在WebRole启动时需要做些事情,把你的代码放在 WebRole.cs ;中) 在这里,您可以覆盖 OnStart()和OnStop(),并将您的代码放在WebRole启动时执行。
我已经用这种方式运行一个BakgroundWorker来执行一些独立于IIS的计划任务。
我希望这有帮助。 的Davide。
注意: 1 - 如果你没有WebRole.cs在项目的根目录中创建并写入内部: 公共类WebRole:RoleEntryPoint { public override bool OnStart() { ......你的代码...... return base.OnStart(); } }
2 - 如果您需要调试代码,请注意您需要在调试中使用 Azure项目运行VS,该项目将引用为“运行”项目“,否则将不会调用WebRole
答案 2 :(得分:1)
您可以尝试在WebRole.cs中添加一些代码,以便从您的网站请求一些网址。我试过了,似乎有点工作。但调试很痛苦,所以我从来没有真正确定它。
另一种选择是使用IIS Application Initialization。您无法在IIS 7.5上使用它,但如果将角色升级到Windows 2012,则可以获得IIS 8(在.cscfg中设置osFamily =“3”)。