检测.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。
您可以尝试在msshrtmi, Version=2.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
程序集上调用Assembly.Load,如果失败,则不要尝试调用RoleEnvironment.IsAvailable方法(因为您知道您绝对不在Azure上运行)。
另外,您可以尝试使用计算机名,因为所有Azure的实例开始与“RD”
非天蓝色的实例也可能在名称以“RD”开头的机器上运行。 – Gusdor
另外 - 如果我在我的模拟器中运行它,机器名称不会以RD开头。我不想查找那些不存在的文件,所以我只用了config switch选项。 –
您可以验证,如果RoleRoot环境变量存在。如果是这样,您的应用程序将以Web或Worker角色运行。
您可以检查使用if(RoleEnvironment.IsEmulated)
由于格雷格 - 我最终使用配置变换来创建一个开关。如果有一种方法可以自动检测,本来会很好,但没关系。再次感谢您的全面回应! –