强制应用程序启动Azure Web角色

时间:2013-01-09 15:23:04

标签: azure iis-7.5 webrole

我在azure上有一个web角色,我想在不等待第一个请求的情况下强制执行A​​pplication_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();
    }
}

3 个答案:

答案 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(在.c​​scfg中设置osFamily =“3”)。