检测.NET应用程序是在Azure中还是在非Azure环境中运行

时间:2013-12-18 11:05:58

标签: c# .net azure azure-role-environment azure-service-runtime

我们目前正将一些应用程序实例移至Azure,但仍将保持与非Azure托管的现有实例的向后兼容性。

如果没有在非Azure生产服务器上安装SDK,是否有一种检测环境的好方法?

我尝试过使用:

if (RoleEnvironment.IsAvailable)

来自Microsoft.WindowsAzure.ServiceRuntime,它在本地完美运行,并且在Azure中运行。但是,我需要将Microsoft.WindowsAzure.ServiceRuntime.dll设置为CopyLocal,即使这样我也得到:

  

无法加载文件或程序集'msshrtmi,Version = 2.2.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'或其中一个依赖项

似乎没有NuGet包,我不想手动复制msshrtmi dll。

也许有一种方法可以在不依赖Microsoft.WindowsAzure.ServiceRuntime的情况下进行检测?

4 个答案:

答案 0 :(得分:5)

不幸的是,解决此问题的最简单方法是从以下位置复制msshrtmi.dll文件:

C:\Program Files\Microsoft SDKs\Windows Azure\.NET SDK\{version}\bin\runtimes\base\x64

我知道复制DLL并不是很好,但这是唯一需要防止错误的,并且它与您正在使用的SDK版本相关联,因此在更新SDK之前不会更改

一个可行的替代方案是在appSettings中添加配置值,并在为Azure构建应用程序时应用config transform

答案 1 :(得分:2)

您可以验证是否存在 RoleRoot 环境变量。如果是,则您的应用程序正在Web或辅助角色中运行。

答案 2 :(得分:2)

您可以使用if(RoleEnvironment.IsEmulated)

进行检查

答案 3 :(得分:0)

您可以尝试在msshrtmi, Version=2.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35程序集上调用Assembly.Load,如果失败,则不要尝试调用RoleEnvironment.IsAvailable方法(因为您知道您肯定不在Azure上运行)。 / p>

或者,您可以尝试使用machinename,因为所有Azure实例都以“RD”

开头