我可以检测我的代码是否在Azure辅助角色中执行?

Off*_*oes 6 c# azure

我有一些在Winforms应用程序,Windows服务和现在Azure工作者角色中使用的共享程序集/项目.

如果我在Azure角色中运行,是否有任何方法可以在运行时检测到.

我已经找到了如何检测是否运行Azure模拟器:

 Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.IsEmulated
Run Code Online (Sandbox Code Playgroud)

但这不符合我的要求.我也不想在共享程序集中添加对任何Azure程序集的引用.

理想情况下,我想要一些类似于我用来检测是否作为控制台与服务运行的东西:

System.Environment.UserInteractive
Run Code Online (Sandbox Code Playgroud)

有什么能给我这个逻辑吗?

Off*_*oes 5

对于任何感兴趣的人,我想我会分享我是如何实施的,感谢@Sandrino Di Mattia 的回答:

您可以检查 RoleRoot 环境变量是否存在(至少对于云服务):

请注意,这不适合 Winforms 应用程序,因为我实际上只在最后需要它用于服务 - 即在服务运行之间进行检测

  • Azure 工作者角色
  • 视窗服务
  • 控制台应用程序

这是一个大纲:

public static class ServiceRunner
{
    private static bool IsAzureWorker
    { 
        get { return !string.IsNullOrEmpty(Environment.GetEnvironmentVariable("RoleRoot")); } 
    }

    public static void Run(string[] args)
    {
        if (IsAzureWorker)
        {
            //Running as Azure Worker
        }
        else if (Environment.UserInteractive) //note, this is true for Azure emulator too
        {
            //Running as Console App
        }
        else
        {
            //Running as Windows Service
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


San*_*tia 3

您可以检查 RoleRoot 环境变量是否存在(至少对于云服务):

或者,为什么不简单地向您的配置添加一个设置(AppSettings 或服务配置):

  <appSettings>
    ...
    <add key="AppEnvironment" value="Azure.CloudService|Azure.Website" />
  </appSettings>
Run Code Online (Sandbox Code Playgroud)

然后,您可以简单地检查该设置是否存在且具有特定值,以了解您正在运行的位置。这也意味着在(自动)构建或部署过程中,您需要包含此设置(例如,可以使用 XDT)。