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

问题描述:

我们目前正在将应用程序的某些实例移动到Azure,但仍将保持与Azure托管的现有实例的向后兼容性。检测.NET应用程序是在Azure还是在非Azure环境中运行

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

我已经尝试使用:

if (RoleEnvironment.IsAvailable) 

从Microsoft.WindowsAzure.ServiceRuntime,和它完美的作品在本地,并且在Azure上。不过,我需要的Microsoft.WindowsAzure.ServiceRuntime.dll设置为CopyLocal,甚至然后我得到:

无法加载文件或程序集“msshrtmi,版本= 2.2.0.0,文化=中立,公钥= 31bf3856ad364e35'或其依赖关系之一

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

也许有一种检测方式没有依赖Microsoft.WindowsAzure.ServiceRuntime?

不幸的是解决这个最简单的方法是将msshrtmi.dll文件复制从:

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

我知道这是不是很漂亮复制的DLL左右,但是这是你唯一需要的一个以防止错误,并将其与您正在使用的SDK版本绑定,因此在更新SDK之前不会更改。

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

+1

由于格雷格 - 我最终使用配置变换来创建一个开关。如果有一种方法可以自动检测,本来会很好,但没关系。再次感谢您的全面回应! –

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

另外,您可以尝试使用计算机名,因为所有Azure的实例开始与“RD”

+1

非天蓝色的实例也可能在名称以“RD”开头的机器上运行。 – Gusdor

+0

另外 - 如果我在我的模拟器中运行它,机器名称不会以RD开头。我不想查找那些不存在的文件,所以我只用了config switch选项。 –

您可以验证,如果RoleRoot环境变量存在。如果是这样,您的应用程序将以Web或Worker角色运行。

您可以检查使用if(RoleEnvironment.IsEmulated)