Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何检测ASP.NET站点是否在本地、azure web角色或azure web站点中运行?_Asp.net Mvc_Azure_Azure Web Roles_Azure Web App Service - Fatal编程技术网

Asp.net mvc 如何检测ASP.NET站点是否在本地、azure web角色或azure web站点中运行?

Asp.net mvc 如何检测ASP.NET站点是否在本地、azure web角色或azure web站点中运行?,asp.net-mvc,azure,azure-web-roles,azure-web-app-service,Asp.net Mvc,Azure,Azure Web Roles,Azure Web App Service,注意:这与检测在本地运行与在Azure角色中运行的问题不同,我知道这一问题已经得到了回答。 我有一个APS.NET MVC应用程序,我将其部署到Azure。我正在运行Azure工具的V2.5。我希望能够检测代码运行在以下三种场景中的哪一种: 本地(在IIS上调试)、Azure网站或Azure web角色 我在其他帖子中看到过使用以下内容的建议: RoleEnvironment.IsAvailable 然而,对于我的需求来说,这似乎是一个不完整的解决方案。它似乎可以检测代码是在本地运行还是作为w

注意:这与检测在本地运行与在Azure角色中运行的问题不同,我知道这一问题已经得到了回答。

我有一个APS.NET MVC应用程序,我将其部署到Azure。我正在运行Azure工具的V2.5。我希望能够检测代码运行在以下三种场景中的哪一种:

本地(在IIS上调试)、Azure网站或Azure web角色

我在其他帖子中看到过使用以下内容的建议:

RoleEnvironment.IsAvailable
然而,对于我的需求来说,这似乎是一个不完整的解决方案。它似乎可以检测代码是在本地运行还是作为web角色运行,没有问题。但是,它似乎没有涵盖检查是否作为azure网站运行的场景。它不仅没有涵盖这一点,而且在Azure网站中运行时尝试检查该属性会使其崩溃:

mscorlib.dll中发生类型为“System.IO.FileLoadException”的第一次意外异常

Additional information: Could not load file or assembly
'Microsoft.WindowsAzure.ServiceRuntime, Version=2.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies.
The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

那么,有人能告诉我如何在这三种情况之间进行检测吗?

我遇到的确定您是否在Azure网站上运行的最佳方法是检查是否存在特定于Azure网站的环境变量,如
网站\网站\名称
。您可以先检查此项,如果变量不存在,则继续执行
RoleEnvironment.IsAvailable
检查


请参阅以了解更多详细信息。

让我为您提供另一种方法,它将让您知道您是否在Azure、Azure Emulator、IIS或本地运行集成测试。这一点很重要,因为在IIS express中调试最终将在Azure中运行的纯web项目或运行集成测试(甚至可能在IIS之外运行)非常有用且速度更快。这意味着您可以更快地调试项目,而不是每次都浪费时间加载/运行azure compute emulator

有几种方法可以检查这个和那个,但这里有另一种方法可以帮助您在所有情况下进行良好的ALM和开发

您可以使用四种可用机制:

  • IIS中的HostingEnvironment对象
  • Azure或Azure Emulator中的RoleEnvironment对象
  • 在任何地方都有一个System.Environment对象
  • 配置-在我的示例中,web.config、web.debug.config、web.release.config、web.debug.staging.config、web.release.production.config、app.config、ServiceConfiguration.Local.cscfg、ServiceConfiguration.CloudStaging.cscfg和ServiceConfiguration.CloudProduction.cscfg
  • 问题在于:如果您尝试访问IIS中模拟的RoleEnvironment.IsAvailable或RoleEnvironment.IsEmulator或Azure中的RoleEnvironment,而不运行Emulator或Azure,则会出现异常。在Azure中,如果环境尚未准备就绪,则带IIS的Emulator也将出现异常-Emulator和IIS正在一起运行,并且IIS没有等待Emulator,即使您在到达Global.asax.cs之前通过RoleEntryPoint。这个“东西”排除了像那样等待的可能性

      while(!RoleEnvironment.IsAvailable)
    
    并迅速、干净地解决问题。此问题还消除了RoleEnvironment.IsEmulated的使用,因为它将在本地IIS或本地集成测试中引发异常,并且无法在它之前检查RoleEnvironment.IsAvailable,因为如果您在Azure或Azure Emulator之外等待它准备就绪,您将等待将要出现的内容

    旁注:有时候在emulator环境中加载MVC项目之后,访问RoleEnvironment属性会引发异常。这可以通过调用等待来轻松缓解

     while(!RoleEnvironment.IsAvailable)
    
    旁注结束

    旁注2 在RoleEntryPoint中设置环境变量如下:

    public class WebRole : RoleEntryPoint
    {
        public override bool OnStart()
        {
            Environment.SetEnvironmentVariable("CodeRunsInAzure","true");
        }
    }
    
    Environment.GetEnvironmentVariable("CodeRunsInAzure")
    
    将不起作用,因为您无法像这样检索它:

    public class WebRole : RoleEntryPoint
    {
        public override bool OnStart()
        {
            Environment.SetEnvironmentVariable("CodeRunsInAzure","true");
        }
    }
    
    Environment.GetEnvironmentVariable("CodeRunsInAzure")
    
    在Global.asax.cs或Web/Worker项目中的其他位置。否则问题很容易解决

    旁注2结束

    解决方案分为两部分。第一个是在您的配置文件中。只需在所有配置中设置所需的变量-*。cscfgs:

    <Setting name="RunsInAzureCloudEnv" value="true/false"/>
    
    如果仅在MVC启动前模拟器已准备就绪: if(RoleEnvironment.IsAvailable&!RoleEnvironment.IsEmulated) 就足够了。 如果有人知道如何让这两件事按准确的顺序发生并分享,那就太好了