Asp.net mvc 如何检测ASP.NET站点是否在本地、azure web角色或azure web站点中运行?
注意:这与检测在本地运行与在Azure角色中运行的问题不同,我知道这一问题已经得到了回答。 我有一个APS.NET MVC应用程序,我将其部署到Azure。我正在运行Azure工具的V2.5。我希望能够检测代码运行在以下三种场景中的哪一种: 本地(在IIS上调试)、Azure网站或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
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和开发 您可以使用四种可用机制:
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)
就足够了。
如果有人知道如何让这两件事按准确的顺序发生并分享,那就太好了