【问题标题】:Detecting if a .NET app is running in Azure or on a non-Azure environment检测 .NET 应用程序是在 Azure 中还是在非 Azure 环境中运行
【发布时间】:2014-01-06 12:41:44
【问题描述】:

我们目前正在将我们应用程序的一些实例移至 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 的情况下进行检测?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢 Greg - 我最终使用配置转换来创建开关。如果有一种自动检测的方法会很好,但没关系。再次感谢您的全面回复!
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        您也可以尝试使用机器名称,因为所有 Azure 实例都以“RD”开头

        【讨论】:

        • 非天蓝色实例也可能在名称以RD 开头的机器上运行。
        • 另外 - 如果我在我的模拟器中运行它,机器名称不会以 RD 开头。我不想查找也不存在的文件,所以我只使用了配置开关选项。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-01
        • 1970-01-01
        • 2011-02-20
        • 1970-01-01
        • 1970-01-01
        • 2021-10-31
        • 2018-12-18
        相关资源
        最近更新 更多