有没有办法捕获RoleEnvironment.CurrentRoleInstance.Role.Name
和UnityWebApiActivator.Start
上的UnityWebApiActivator.Shutdown
或其他等效方法?
编辑1:
当前代码始终返回“localhost”(即使在部署到azure之后)
var name = RoleEnvironment.IsAvailable ? RoleEnvironment.CurrentRoleInstance.Role.Name : "localhost";
答案 0 :(得分:1)
根据这个帖子。 What starts first Application_Start or WebRole's OnStart?
在1.3之前,托管工作者核心(HWC)托管在RoleEntryPoint中,因此存在确定性启动(OnStart,Application_OnStart,IIRC)。但是,当IIS现在托管Web时,IISConfigurator.exe会创建应用程序池等,最终w3wp.exe将托管您的网站。这是一个与RoleEntryPoint不同的过程,因此任何一个都可以先启动。
众所周知,UnityWebApiActivator.Start方法在Application_OnStart之前执行。因此,我们无法确定将为UnityWebApiActivator.Start和RoleEntryPoint.OnStart执行哪种方法。因此,如果首先执行UnityWebApiActivator.Start方法,RoleEnvironment的IsAvailable属性将为false。
如果您想获取角色名称,我建议您创建一个自定义RoleEntryPoint并在其OnStart方法中获取角色名称。
public class MyRoleEntryPoint: RoleEntryPoint
{
public override bool OnStart()
{
var name = RoleEnvironment.IsAvailable ? RoleEnvironment.CurrentRoleInstance.Role.Name : "localhost";
return base.OnStart();
}
}
另一种解决方法是在获取角色名称之前等待RoleEnvironment可用。
public class UnityWebApiActivator
{
public static void Start()
{
while (!RoleEnvironment.IsAvailable)
{
Thread.Sleep(100);
}
var name = RoleEnvironment.CurrentRoleInstance.Role.Name;
}
}