WebAPI和Azure - OnStart和OnShutdown

时间:2017-05-25 13:28:08

标签: c# azure asp.net-web-api

有没有办法捕获RoleEnvironment.CurrentRoleInstance.Role.NameUnityWebApiActivator.Start上的UnityWebApiActivator.Shutdown或其他等效方法?

编辑1:
当前代码始终返回“localhost”(即使在部署到azure之后)

var name = RoleEnvironment.IsAvailable ? RoleEnvironment.CurrentRoleInstance.Role.Name : "localhost";

1 个答案:

答案 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;
    }
}