天道酬勤,学无止境

如何检测 ASP.NET 站点是否在本地运行、以 azure web 角色或 azure 网站运行?(How to detect if ASP.NET site is running locally, in azure web role, or azure web site?)

问题

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

我有一个部署到 Azure 的 APS.NET MVC 应用程序。 我正在运行 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)

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

回答1

我遇到的确定您是否在 Azure 网站上运行的最佳方法是检查是否存在特定于 Azure 网站的环境变量,例如WEBSITE_SITE_NAME 。 您可以先检查一下,如果该变量不存在,请继续检查RoleEnvironment.IsAvailable

有关更多详细信息,请参阅此答案。

回答2

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

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

您有四种可用的机制可供使用:

  1. IIS 中的 HostingEnvironment 对象
  2. Azure 或 Azure 模拟器中的 RoleEnvironment 对象
  3. 您随处可见的 System.Environment 对象。
  4. 配置 - 在我的例子中 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.IsEmulated 而没有在 Emulator 或 Azure 中运行,则会出现异常。 如果环境尚未准备好,在带有 IIS 的 Azure 模拟器中也会出现异常 - 模拟器和 IIS 一起运行并且 IIS 不会等待模拟器,即使您在到达 Global.asax.cs 之前通过 RoleEntryPoint。 这个“东西”消除了这样等待的可能性

  while(!RoleEnvironment.IsAvailable)

并快速干净地解决问题。 此问题还消除了 RoleEnvironment.IsEmulated 的使用,因为它会在本地 IIS 或本地集成测试中抛出异常,并且无法在它之前检查 RoleEnvironment.IsAvailable,因为如果您在 Azure 或 Azure 模拟器之外等待它准备就绪你会等待将要出现的东西。

旁注:有时在模拟器环境中可以稍后加载,然后您的 MVC 项目和访问 RoleEnvironment 属性会引发异常。 这可以通过调用等待它来轻松缓解

 while(!RoleEnvironment.IsAvailable)

附注结束。

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

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"/>

在 ServiceConfiguration.Local.cscfg 中 - 假和 cscfg 中的其他地方 - 真。 然后在 web.*.config / app.config 中相应地

<add key="RunsInAzureCloudEnv" value="true/false"/>

这样,只有在您发布或在模拟器中运行时,变量才会设置为 true,否则它将为 false。

使用它的一种情况是当您只想在 azure 中运行代码时 - 例如在 IDatabaseInitializer 的自定义实现中将旧数据库的版本从退役的 WEB 版本更新为 BASIC。 在这种情况下,您只需要在 Azure 中运行您的代码,并且仅当它不在模拟器中,而是在您的暂存或生产环境中运行时。 示例用法如下:

// check the variable that is set only in azure environment
var runsInAzureEnvStr = CloudConfigurationManager.GetSetting("RunsInAzureCloudEnv");
bool runsInAzureEnv = false;
Boolean.TryParse(runsInAzureEnvStr, out runsInAzureEnv);

if(!runsInAzureEnv)
{
    return;
}   

如果仅在启动 MVC 之前准备好模拟器: if(RoleEnvironment.IsAvailable && !RoleEnvironment.IsEmulated) 就足够了。 如果有人知道如何让这两者按确切的顺序发生并分享——那就太好了。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Azure网站和Azure Web角色有什么区别(What is the difference between an Azure Web Site and an Azure Web Role)
    问题 新的Azure网站和ASP.NET MVC应用程序的传统Azure Web角色之间有什么实质区别? 我为什么选择“网站角色”而不是“网站角色”,反之亦然? 假设在两种情况下我都需要相等的容量(例如2个小实例)。 除了在预览期间网站有33%的临时折扣这一事实外,这些价格似乎具有可比性。 使用Web角色,我可以做些难以解决的事情吗? 例如,使用“网站”将多个网站放置在一组虚拟机中变得容易吗? 我是否会因为“网站”与“网络角色”而失去任何东西? 能够微调IIS? 是否可以在本地使用缓存服务? 回答1 Web角色为您提供Web应用程序(以前称为Web站点)以外的其他功能: 能够运行提升的启动脚本来安装应用,修改注册表设置,安装性能计数器,微调IIS等。 能够将应用程序划分为多个层(可能是用于前端的Web角色,用于后端处理的辅助角色)并可以独立扩展能够将RDP导入您的VM以进行调试网络隔离专用的虚拟IP地址,允许云服务中的Web角色实例访问受IP限制的虚拟机 ACL限制的终结点(Azure SDK 2.3中新增,2014年4月) 支持任何TCP / UDP端口(网站仅限于TCP 80/443) Web应用程序比Web角色具有以下优势: 具有部署历史记录/回滚的近乎即时的部署 Visual Studio Online,github,本地git,ftp,CodePlex,DropBox
  • 是否可以在不重新部署我的应用程序的情况下编辑部署在Windows Azure上的云应用程序的web.config?(Is it possible to edit web.config of cloud app deployed on windows Azure without redeploying my app?)
    问题 是否可以在不重新部署我的应用程序的情况下编辑部署在Windows Azure上的云应用程序的web.config文件? 场景就像-> 云应用程序部署在具有3个实例的Azure上。 web.config在appsetting中有一些静态文本,显示在主页上(例如- ©2009我的网站。保留所有权利) 现在,我希望将Web.Config中提到的静态文本从2009年更改为2010年。 现在,我希望编辑Web.Config而不重新部署我的站点。 我不希望->在使用更新的Web.Config进行标记时部署我的应用程序,然后将其与生产交换。 有什么技巧可以从运行时部署的程序包中更新文件吗? 回答1 根据Maxim在下面的评论中,此答案现在已过时。 您可以使用Microsoft.Web.Administration.ServerManager库以编程方式在OnStart事件中修改Web角色的web.config设置。 ***将原始答案保留为当时正确的答案,因为自回答此问题以来我从未使用过Azure,并且我不确定100%是否有效。 一言以蔽之。 您必须使用服务配置文件进行此类设置。 决定是否在服务配置设置和Web配置设置中放置密钥。 您可以问自己以下问题: 每次部署时此设置都会更改吗? 如果是这样,则Web配置设置是此信息的正确位置。 部署后此设置会更改吗? 如果是这样
  • 将 Azure 网站迁移到 Azure 云服务(Migrate Azure Web Site to Azure Cloud Service)
    问题 我有一个项目,我计划将 Web 应用程序作为 Azure 网站启动,然后将其迁移到 Azure 云服务(也称为托管服务)作为扩展策略。 之所以做出这个决定,是因为我了解到 Azure 网站开发起来更加简单快捷,几乎没有特定于 Azure 的配置或代码。 所以快速而简单的开始是项目的一个很好的起点。 但是,这对您来说是一个好的起点吗? 将 Azure 网站迁移到 Azure 云服务与将普通 ASP.NET 网站迁移到 Azure 云服务是否相同? 您会从一开始就使用 Azure 云服务吗? 如果是,为什么? 谢谢你的时间。 回答1 这两种部署模型都有好处,它最终会归结为您试图实现的目标以及最终应用程序的成功。 下面我概述了每个模型的优缺点,以确保您为您的应用程序目标做出正确的选择。 Windows Azure 网站 您已经正确地确定 Windows Azure 网站是应用程序的一个很好的起点,但是您也可以考虑网站确实为许多解决方案提供了足够的可伸缩性。 优点 预览期间的10 个免费网站[免费 12 个月] 轻松部署(使用 Git、TFS、Web 部署或 FTP) 快速可扩展性(您可以移动到您自己的专用集群 [又名保留标准]) 简单开发(支持经典 ASP、ASP.NET、Node.js、Python 和 PHP) 持久化环境(大多数人都习惯了) 缺点 自定义域不支持 SSL
  • 在Azure网站预览中删除服务器和X-Powered by HTTP标头(Removing Server and X-Powered-By HTTP Headers on Azure Web Site Preview)
    问题 为了安全起见,我想删除所有显示我的应用程序正在运行的OS,Web Server或Framework的详细信息的HTTP标头。 使用SO和其他地方的文章,我能够将所有内容从IIS Express本地显示中删除。 不幸的是,当我发布到Azure网站预览时,仍然保留了三个标题: 伺服器:Microsoft-IIS / 7.5 X-Powered-By:ARR / 2.5 X-Powered-by:ASP.NET 我发现的文章是针对Azure Web角色而不是诸如Web站点预览之类的。 有谁知道如何从“网站预览”中删除? 回答1 Windows Azure网站是共享的基础结构,您无权像在Web角色中一样配置IIS。 正如您正确指出的那样,您可以删除以下标头: X-AspNet版本 X-AspNetMvc版本 但剩下以下内容: 伺服器:Microsoft-IIS / 7.5 X-Powered-By:ARR / 2.5 X-Powered-by:ASP.NET 即使您执行了所有必要步骤以抑制这些标头,您也将从我的博客文章中看到, HTTP.SYS将在内核级别处理非法请求,这将返回Microsoft-HTTPAPI / 2.0标头。 您需要编辑注册表以删除此标头。 结论是,如果您想对IIS和HTTP.SYS进行最终控制,则需要将网站托管在非共享的基础结构中。 因此
  • 在 Azure 上使用带有 SqlMembership 提供程序的表单身份验证连接 ASP.NET Web 应用程序(Wiring up ASP.NET Web Application using Forms Authentication with SqlMembership Provider on Azure)
    问题 我正在试用 Microsoft Azure 门户,以了解我的旧应用程序如何以最少的重写量执行。 身份验证是个问题。 背景:此 ASP.NET Web 应用程序当前使用 SqlMembership Provider for Users、Roles、Profiles 和 Personalization。 是的,已经有很多关于 ASP.NET 身份、简单成员资格、通用提供程序的博客,而且 ASP.NET SqlMembership 提供程序正在逐步淘汰。 但是,如果可能的话,我仍然宁愿在 Azure 上使用旧的 asp.net 会员资格。 目前,我可以将我的 VS.NET 2013 解决方案发布到 Azure,但我无法登录。 只要我导航到该 url,它就会以 Azure 门户用户的身份自动登录。 似乎 Windows 身份验证处于活动状态,而不是表单。 这是我到达这里的方式: 我使用 Sql Azure 的特殊 Azure 友好脚本在 Sql Azure 上创建了 sql 成员资格表(此处:https://support.microsoft.com/kb/2006191)。 但是,当我在 azure 站点上运行我的应用程序与在本地运行它时,我看到了不同的行为。 在 azure 上采用了不同的身份验证机制:首先,系统会提示我使用我的组织 ID(这是我的 msdn 电子邮件)登录
  • 控制器操作多次触发 - 在 Azure 模拟器中运行的 ASP.NET MVC 4 应用程序(Controller actions hit multiple times - ASP.NET MVC 4 App running in Azure Emulator)
    问题 这可能需要一些时间来解释,但我走了:)。 我创建了两个 Visual Studio 2012 项目: 在 Visual Studio 的“添加项目”对话框中使用(Web -> ASP.NET MVC 4 Web 应用程序)模板的项目。 我没有添加单元测试项目。 使用 Azure 云服务模板(云 -> Windows Azure 云服务)的项目。 我添加了一个角色,一个 ASP.NET MVC 4 Web 角色,并且再次没有添加单元测试项目。 我让这两个项目完全没有受到 Visual Studio 为我创建它们的方式的影响。 对于每个项目,我然后转到HomeController类并在每个About和Contact操作方法(仅返回视图的无聊操作)中设置断点。 例如,我在方法的唯一一行上设置了一个断点: public ActionResult About() { return View(); } 然后我开始调试第一个项目(非 Azure 项目)。 一切都如预期般 - 即,当我使用浏览器在 About 和 Contact 页面之间导航时,相应操作方法中的断点将在每个请求上命中一次。 对我来说似乎很好。 然后我开始调试 Azure 项目。 我遵循了在“关于”和“联系”页面之间导航的相同过程。 这次我发现了有趣的非确定性行为。 对于某些请求,在页面呈现之前,操作方法中的断点会被多次
  • EvoPDF 库在 Windows Azure 托管站点上失败(EvoPDF library fails on Windows Azure hosted site)
    问题 EvoPDF HTML 到 PDF 转换库 (http://www.evopdf.com/) 声称它支持 Windows Azure Cloud 平台,但是我无法让它工作。 我得到了例外: [Exception: Could not get conversion result header. Data receive error. Could not receive data. Error code: 109] EvoPdf.HtmlToPdf.ImgConverter.GetLayoutFromUrl(String url, ps& htmlParseInfo) +622 EvoPdf.HtmlToPdf.PdfConverter.ConvertAndGetPdfDocument(String url, String htmlString, String baseUrl, String internalLinksDocUrl, Boolean fromUrl) +9748 EvoPdf.HtmlToPdf.PdfConverter.ConvertAndSaveToStream(Stream outStream, String url, String htmlString, String baseUrl, String internalLinksDocUrl, Boolean
  • 如何通过(区域)vnet 将 Azure 网站连接到辅助角色 (TCP)? 是否可以?(How to connect Azure Web Sites to a Worker Role (TCP) through a (regional) vnet? Is it possible?)
    问题 如何建立从 Azure PaaS 托管网站到工作角色的 TCP 连接? 它部署在一个虚拟网络中。 这是否可以在不打开输入端点、工作者角色上面向 Internet 的端口的情况下完成? 根据 Azure 虚拟网络常见问题解答,网站目前似乎不能成为虚拟网络部署的一部分: 我可以通过虚拟网络使用 Windows Azure 网站吗? 不可以。我们不支持具有虚拟网络的网站。 我是 Azure 的新手,正在使用各种配置,看起来这可能可以通过新的区域 vnet(可能还有内部负载均衡器)来完成,但同样没有关于其他的真正信息而不是它们位于不同的虚拟机和不同的网络中,因此使它们进行通信是一个更复杂的过程。 如果它有助于讨论,我有以下是区域 vnet 配置,由工作人员Xyz.ComputeRole 使用。 此角色是接受 TCP 连接的角色。 <编辑:我发现了一篇关于 Windows Azure 虚拟网络中机器的网络隔离选项的非常好的帖子。 就目前而言,看起来我可以为辅助角色打开一个输入端点,然后仅从 WebSites 部署限制对它的访问。 然而,它看起来有很多工作要做,并且像负载平衡器一样跳过网络元素,也许我需要找出网站部署 IP。 我是否在基地外,有一种简单的方法可以通过 TCP 连接将网站连接到 Azure 计算机角色? 网络配置 <VirtualNetworkConfiguration>
  • 我可以检测我的代码是否以Azure辅助角色执行吗?(Can I detect if my code is executing in an Azure worker role?)
    问题 我有一些在Winforms应用程序,Windows服务以及现在的Azure工作人员角色中使用的共享程序集/项目。 如果我以Azure角色运行,有什么方法可以在运行时检测到。 我发现了如何检测是否运行Azure模拟器的方法: Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.IsEmulated 但这不能满足我的要求。 我也希望不必在共享程序集中添加对任何Azure程序集的引用。 理想情况下,我希望使用类似于用于检测是作为控制台还是服务运行的东西: System.Environment.UserInteractive 有什么能给我这种逻辑的吗? 回答1 您可以检查RoleRoot环境变量是否存在(至少对于Cloud Services): MSDN 或者,为什么不简单地将设置添加到您的配置中(AppSettings或服务配置): <appSettings> ... <add key="AppEnvironment" value="Azure.CloudService|Azure.Website" /> </appSettings> 然后,您可以简单地检查设置是否存在特定的值,以查看运行位置。 这也意味着在(自动)构建或部署过程中,您将需要包括此设置(例如,使用XDT可以做到这一点)。 回答2 对于任何有兴趣的人
  • Azure .NET 4.5 支持(Azure .NET 4.5 support)
    问题 好的,我在网上找不到明确的答案,所以我想我会就这个问题询问社区。 .NET 4.5 上周已经使用 RTM,并且正在考虑升级我们的产品以使用它。 在我们实现这一飞跃之前,我首先需要检查这是否会影响我们产品(ASP.NET MVC 东西)的任何 Azure 部署。Azure 平台的最新生产版本是否在其 Web 和辅助角色中支持 .NET 4.5? 我知道可以在 VM/角色预热期间使用启动 power shell 脚本安装框架的 RC,但我不希望这个负担给我的应用程序,我只是想知道它是否安全在 Azure 的当前状态下使用 .NET 4.5 和 MVC 4 等? 回答1 Azure SDK v1.8(2012 年 10 月)可供下载:http://www.microsoft.com/en-us/download/details.aspx?id=35448 支持:.NET 4.5、Windows Server 2012 和 IIS 8.0:http://msdn.microsoft.com/en-us/library/windowsazure/ff683673.aspx#BK_October2012 若要使用支持 .NET 4.5 的 Windows Server 2012,请将 Azure 角色 .cscfg 文件中的 osFamily="2" 更改为 osFamily="3"。
  • 如何验证 Azure 负载均衡器?(How to verify Azure Load Balancer?)
    问题 我希望能够以这样一种方式配置 Azure 负载平衡器模拟器,即对 Web 应用程序的两次连续调用将始终导致对不同实例的调用。 我怎样才能做到这一点? 如何验证负载均衡器是否按预期工作? 使用 HttpContext.Current.Request.Url 并查看端点端口是否更改? 提前致谢 回答1 可用于您的 Windows Azure Web 和 Worker 角色的默认负载均衡器是软件负载均衡器,可配置性不强,但它们在循环设置中工作。 如果您想测试此行为,您需要执行以下操作: 创建两个(或多个)服务实例并启用 RDP 访问,以便您可以 RDP 到两个实例 RDP 到您的两个实例并在其中运行 NETMON 或任何网络监视器解决方案。 现在从您的桌面访问您的 Windows Azure Web 应用程序您需要了解,当从您的桌面建立网络连接时,根据网络设置(默认为 60 秒),该连接仍处于活动状态,因此您需要等到默认超时过后才能再次访问您的 Windows Azure Web 应用程序。 当您再次访问您的 Windows Azure Web 应用程序时,您可以验证请求进入下一个实例的秒数。 请务必传递连接超时,否则您的请求将继续由同一实例处理。 注意:如果您不想使用 RDP,您当然也可以创建一个测试 ASP.NET 页面,根据您的特定实例编写一些特殊代码
  • 朱永光|Service Fabric简介与开发
    朱永光|Service Fabric简介与开发 朱永光 中生代技术备注:本分享将介绍Service Fabric——这一由微软出品的微服务框架的基本特性、开发模型、部署模式和运维相关知识。以期让大家对Service Fabric有个粗浅了解,即使不一定会在项目中采用,也可以给自己正在搭建的微服务平台提供一些灵感和参考。由于我最近的关注点在数据分析领域,所以对于Service Fabric也没有在项目中实际运用,所以只能分享Service Fabric的简单介绍,无法涉及具体的运用经验,就当作是官方文档的一个简化版本。同时本人水平有限难免有错漏,还请大家谅解。备注:有关部署和运维的详细简介由于时间关系,以后有机会再进行分享 备注:包括 Azure SQL 数据库、Azure DocumentDB、Cortana、Microsoft Power BI、Microsoft Intune、Azure 事件中心、Azure IoT 中心、Skype for Business 和许多核心 Azure 服务都构建在Service Fabric上。支持.NET和Java的编程模型;支持任意语言的可执行应用;支持Azure部署、其他云平台部署、本地数据中心部署;SDK和本地模拟器支持Windows和Linux上的.NET和Java,Mac OS可以使用Linux虚机实现开发。备注:在分布式系统中
  • Azure网站调试(Azure website debugging)
    问题 我了解可以使用此处概述的方法调试Azure Web角色:http://msdn.microsoft.com/zh-cn/library/windowsazure/ee405479.aspx 调试Windows Azure网站的过程是什么? 我希望能够单步执行代码,设置断点等。 回答1 更新: Azure门户已更改,“应用程序设置”刀片式服务器已淘汰。 我认为对于Azure管理门户和VS的最新版本,这应该得到更新的答案。 这是我使用Visual Studio 2017 Preview 7.1实现ASP.Net Core 2.0 API的远程调试的方式: 打开Azure管理门户,浏览到您的Web应用,单击“配置”>“常规设置”,然后打开远程调试。 以前它也要求提供VS版本,但这似乎不再是一个选择,我假设远程调试平台现在可以自动检测(但也可能是2015年之前的VS版本不再存在的情况)支持,请参阅下面的评论) 编辑您的发布配置文件,并将配置设置为“调试”,然后将API重新发布到Azure: 在代码中设置断点在Visual Studio中打开“服务器资源管理器”窗格,如果尚未使用Microsoft帐户连接到Azure,则将其连接。 打开“ Azure”>“应用程序服务”>“ [资源组]”,然后右键单击您的Web应用程序,然后选择“附加调试器” 。 进行一些配置后,它应该会附加,并且
  • 在单个 Azure 云服务上部署多个 Web 角色和辅助角色(Deploying Multiple Web Roles and Worker Roles on a Single Azure Cloud Service)
    问题 这可能不是新的,但我希望有人能让我走上正轨,因为它在 azure 部署过程中有点混乱。 我正在计划在 Azure 上进行部署。 这就是我所拥有的 面向公众的 ASP.Net MVC 应用程序(网络角色)+ WCF 服务(网络角色)只能由这个 ASP.NET 应用程序访问 + WCF 服务(工作人员角色)再次访问 1. 通过消息队列一个自定义 STS,即 ASP.NET MVC 应用程序(网络角色)充当 Id-Provider(对于 1. 这是一个依赖方)+ WCF 服务(网络角色),以向 RP 公开一些 STS 功能,例如 1。 SQL Azure:由 1 和 2 访问 注意:1. 最终将发展成为一个门户,在 Web 和辅助角色上托管多个 wcf 服务,用于内部和外部访问。 我的问题是,如果 1. 将成为向公众公开的应用程序,而 2. 用于 1. 联合安全性(内部),我应该如何在 azure 上规划我的部署,记住 1. 将需要在某个时候横向扩展后来随着两个 wcf 服务? 我是发布到一项云服务还是如何发布?。 我的理解是云服务是 n-web/worker 角色的逻辑容器。 但是当你有 2 个 web 鞋底时,比如在这种情况下两个 asp.net 应用程序,哪一个成为默认的? 最好的问候萨蒂什 回答1 默认情况下,解决方案中的所有 Web 角色都是公开的。 如果您愿意
  • 如何强制编译ASP.NET MVC视图?(How do I force compilation of ASP.NET MVC views?)
    问题 我有一个Windows Azure Web角色,其中包含使用ASP.NET MVC的网站。 当HTTP请求到达并首先加载页面时,将编译视图(.aspx或.cshtml),这需要花费一些时间,因此,第一次提供页面时,它花费的时间要比稍后提供相同页面的时间长得多。 我已启用<MvcBuildViews> (在此答案中进行了描述)以强制视图的编译时验证,但是在部署和运行站点时,这似乎对其编译没有任何影响。 Azure Web角色具有所谓的启动任务,还有一个特殊的OnStart()方法,可以在其中放置任何预热代码,因此一旦我知道该怎么做,将其添加到角色中就没问题了。 有没有一种方法可以强制编译所有视图? 回答1 看看David Ebbo的“预编译的剃刀视图” 你为什么想这么做? 这样做的原因之一是,避免在站点启动时对运行时造成任何影响,因为在运行时没有任何可编译的内容。 这在具有许多视图的站点中可能很重要。 另外,您完全不再需要部署cshtml文件,从而可以减小部署文件集。 另一个很酷的好处是,它使您能够对视图进行单元测试,这对于标准的运行时编译模型而言一直是非常困难的。 我将在以后的文章中更详细地介绍这一点。 回答2 事实证明,可以使用ClientBuildManager.PrecompileApplication执行ASP.NET预编译,并模仿按需编译行为,但仅编译每个页面。
  • ASP.NET 标识:使用角色授权属性在 Azure 上不起作用(ASP.NET Identity: Authorize attribute with roles doesn't work on Azure)
    问题 我刚刚在 Azure 上发布了带有 Identity 和 OWIN 授权的新 ASP.NET MVC 网站。 前端效果很好,但后端有问题。 我将 [Authorize] 属性与我的管理控制器一起使用来检查用户是否具有访问它所需的角色,如下所示: [Authorize(Roles = "Admin")] 在本地主机上,即使使用远程 Azure SQL 数据库也能正常工作。 但是在 Azure 上,任何具有授权属性且角色加载几分钟然后抛出的控制器: 与 SQL Server 建立连接时发生与网络相关或特定于实例的错误。 服务器未找到或无法访问。 验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供者:SQL 网络接口,错误:26 - 错误定位服务器/指定的实例) 没有角色的授权属性工作正常。 回答1 将此代码添加到 web.config 可解决此问题。 <system.webServer> <modules> <remove name="RoleManager" /> </modules> </system.webServer> 我知道现在已经晚了,但我有一个真正的答案给你。 我想无论如何我都会分享它,因为我自己只是浪费了几个小时。 从这篇文章中找到的信息 回答2 没有真正解决 Azure 的问题,最后写了我自己的 Authorization 属性。
  • 无法使用 Spring.NET 向 Azure WorkerRole 对象注入依赖项(Cannot inject dependencies to Azure WorkerRole object using Spring.NET)
    问题 我在使用 spring.net 4.0 和 nhibernate 3.0 为基于 ASP.net 的 Web 应用程序开发 Web 应用程序方面有中等经验。 最近遇到一个情况,我需要使用 spring.net 来注入属于WorkerRole类的服务依赖项。 我创建了 app.config 文件,就像我通常在 spring 上打开 web.config 文件一样。 这是为了清楚起见。 (我已经排除了根节点) <configSections> <sectionGroup name="spring"> <section name="context" type="Spring.Context.Support.WebContextHandler, Spring.Web" requirePermission="false" /> <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" requirePermission="false" /> <section name="parsers" type="Spring.Context.Support.NamespaceParsersSectionHandler, Spring.Core" /> </sectionGroup
  • 无法使用模拟器在本地运行 azure web 角色(Can't get azure web role to run locally using the emulator)
    问题 我有一个 web 角色,我试图使用模拟器在本地运行。 我让它在另一台计算机上工作,但我无法让它在另一台计算机上工作,并且已经重新格式化它并从头开始。 当我从 Visual Studio 启动站点时,Chrome 显示以下消息: This webpage is not available The connection to 127.0.0.1 was interrupted. 底部还列出了错误代码: Error 101 (net::ERR_CONNECTION_RESET): The connection was reset. 构建输出中的一件有趣的事情是这些行: Starting process 'C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\Windows Azure Tools\v1.8\Debugger\WindowsAzureDebugger.exe' with arguments '"C:\Program Files\IIS Express\iisexpress.exe" /trace:error /config:"C:\Users\brian\AppData\Local\dftmp\Resources\159c7254-b7d0-4076
  • SQL Azure:更多间歇性超时(SQL Azure: More Intermittent Timeouts)
    问题 我们有一套运行在 Windows Azure 和 SQL Azure 上的 5 个在线拍卖系统。 每个系统由一个网络工作者和一个或多个网络角色组成。 每个系统都使用 ASP.NET MVC 3 和实体框架、存储库模式和 StructureMap。 worker 角色负责内务管理并运行两组进程。 一组每十秒运行一次,另一组每秒运行一次。 每个进程可能会运行一个数据库查询或存储过程。 这些是通过 Quartz.net 安排的 Web 角色服务于公共界面和后台。 在其他基本的 crud 功能中,这两个提供的屏幕在打开时将重复调用控制器方法,这将导致执行存储过程只读查询。 每个客户端的重复频率约为 2-3 秒。 一个典型的用例是打开 5 个后台窗口,打开 25 个最终用户窗口——所有这些窗口都反复访问系统。 很长一段时间以来,我们一直遇到间歇性 SQL 超时错误。 其中最常见的三种是: System.Data.SqlClient.SqlException:从服务器接收结果时发生传输级错误。 (提供者:TCP 提供者,错误:0 - 远程主机强行关闭了现有连接。) System.Data.SqlClient.SqlException:从服务器接收结果时发生传输级错误。 (提供者:TCP 提供者,错误:0 - 信号量超时期限已过期。) System.Data.SqlClient
  • 在Azure Service Bus上检测和删除孤立的队列,主题或订阅(Detect and Delete Orphaned Queues, Topics, or Subscriptions on Azure Service Bus)
    问题 如果由于崩溃或其他异常终止(实例重新启动等),不再有任何发布者或订阅者读取或写入队列,主题或订阅,则该队列/主题/订阅是否有效地被孤立了? 我通过创建一些队列,然后终止应用程序进行了测试。 这些队列在很长一段时间后仍在服务总线上。 看来他们将永远呆在那里。 如果我们想要该行为,那将是很棒的事情,但是在这种情况下,我们不会这样做。 我们如何检测和删除这些队列,主题和订阅? 它们将计入Azure限制等,并且每次实例重新启动/修补/崩溃时,我们都无法拥有这些孤立的进程。 如果这有助于使问题更清楚,则这是一种独特的情况,其中队列/主题/订阅具有特殊名称或特殊过滤器,并且在有限的时间内具有非常有限的一组发布者(1)和订阅者(​​1)。 这不是我们想要生存的情况。 这些是特定于实例的响应通道。 无论我们使用队列还是订阅都是无关紧要的。 如果该实例已消失,则对该队列(或订阅)的需求也将消失。 这是解决方案的一部分,其中每个Web角色都有其监视的专用响应通道。 在任何时候,此Web角色都可能有数十个通过其他消息传递通道(队列/主题)挂起的请求,并且正在等待多个线程上的答案。 我们需要响应返回到放置消息的线程,以便Web角色可以响应调用者。 在这种情况下,仅具有基于计算机的订阅是不好的,因为它将接收其他线程的消息。 我们需要每个发布线程来建立专用的响应通道