2013-01-09 61 views
6

我在azure上有一个web角色,我想在不等待第一个请求的情况下强制Application_Start。在Azure Web角色上强制应用程序启动

我设法设置“自动启动”属性设置为true在我的网站

AutoStart a WCF on Azure WebRole

不过的Application_Start不叫,直到第一个请求到达。

我不知道我是否缺少重要的东西。服务器是W2008 R2和IIS版本是7.5

谢谢!

SOLUTION

我把解决代码在这里。我希望能帮助别人。我刚刚添加了一个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

IIS只会在第一个请求到达时启动。解决方法是从OnStart或您的RoleEntryPoint后代向同一虚拟机发送HTTP请求 - 使用WebRequest或同等级别很容易。

+0

这就是我现在正在尝试的内容XD – Jordi

+0

我刚刚用这个解决方案编辑了我的解决方案。谢谢! – Jordi

+0

我为客户使用4种生产环境的相同解决方案。必须有多个节点(实例),随机请求会突然很慢,显然是因为它们在这些请求上运行App Start。如果需要,可以提供代码吗? – Ash

1

霍迪,我最近经历过同样的问题。

基于我的测试Application_Start()仅在WebApp的第一个请求ISS时被调用。 (如果您尝试在Debug中打开VS而没有打开任何页面(请参阅proj/debug中的选项),您将看到如果不在Azure中运行WebApp,也将不会调用Application_Start())

我想,你需要做的有些事情当WebRole开始,以及把你的代码在WebRole.cs) 在这里,您可以覆盖的OnStart()和调用OnStop(),把你的代码wiil被execuded当WebRole将开始。

我已经使用这种方式运行一个独立于IIS执行某些计划任务的BakgroundWorker。

我希望这个帮助。 Davide。

注: 1 - 如果你dont'have一个WebRole.cs在项目的根目录创建并写入内部: 公共类WebRole:RoleEntryPoint { 公共覆盖布尔的OnStart(){ ... 你的代码... return base.OnStart(); } }

2 - 如果你需要调试代码记住,你需要在调试与Azure项目引用Web应用程序为“运行项目”否则运行VS WebRole将不会被调用

+1

请注意,WebRole.cs中的代码与IIS不同的进程运行。因此,某些类型的初始化(内存中的预加载数据,打开连接等)不能在那里完成。 –

+0

感谢Brian,这确切是发生在我身上的事情:( – Jordi

1

您可以尝试在WebRole.cs中添加一些代码以从您的网站请求一些URL。我已经尝试过了,它似乎有点用。但调试很痛苦,所以我从来没有真正明白过。

另一种选择是使用IIS Application Initialization。您不能在IIS 7.5上使用它,但如果将角色升级到Windows 2012(在.cscfg中设置osFamily =“3”),则可以获得IIS 8。

相关问题