我在azure上有一个web角色,我想强制一个Application_Start而不等待第一个请求。
我设法在我的网站上将"自动开始"属性设置为true
在Azure WebRole上自动启动WCF
但是Application_Start在第一个请求到来之前不会被调用。
我不知道我是否在这里遗漏了一些重要的东西。服务器为W2008 R2, IIS版本为7.5
谢谢!
<解决方案/strong>
我把解决方案代码放在这里。我希望能帮到别人。我只是添加了一个WebRole.cs,并把代码每30秒执行一次ping。请注意我正在浏览服务。因为这是我的端点,你的端点可以是另一个。注意,我要的是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();
}
}
IIS只会在第一个请求到达时启动。解决方法是从OnStart
或RoleEntryPoint
后代中向同一VM发送HTTP请求-这很容易使用WebRequest
或等效类。
Jordi,我最近也遇到了同样的问题。
基于我的测试,Application_Start()只在WebApp的第一个请求ISS时被调用。(如果你尝试在调试中启动VS而不打开任何页面(参见proj/Debug中的选项),你会看到Application_Start()也不会被调用,如果你不在Azure中运行WebApp)
我认为你需要做一些事情当WebRole开始,我们把你的代码在WebRole.cs;)在这里,你可以重写OnStart()和OnStop(),并把你的代码将在WebRole启动时执行。
我使用这种方式来运行一个backgroundworker,它独立于IIS执行一些计划任务。
我希望这有帮助。大卫。。
注意:1 -如果你没有一个WebRole.cs创建它在项目的根,并在里面写:公共类WebRole: RoleEntryPoint{public override bool OnStart(){…你的代码……返回base.OnStart ();}}
2 -如果你需要来调试代码,你需要运行VS在调试中使用Azure项目,将WebApp 作为"运行项目", 否则WebRole将不会被调用
你可以试着在你的WebRole.cs中放一些代码来从你的网站请求一些url。我试过了,似乎有点效果。但是调试起来很麻烦,所以我一直没能把它搞定。
另一个选项是使用IIS应用程序初始化。你不能在IIS 7.5上使用它,但如果你将你的角色升级到Windows 2012,你可以得到IIS 8(在你的。cscfg中设置osFamily="3")。