Azure 云服务 Web 角色网页未加载

Azure Cloud Service Web Role web pages do not load

这很可能会很长 post 来尝试全面解释我的 Azure 云服务是如何部署的,以及我已经尝试解决这个问题的方法,所以提前致歉并感谢。

框架:4.5.1
Azure SDK:2.5
Visual Studio: 2013 更新 4

问题:

在我尝试加载网页时发布我的 Azure 云服务时,浏览器将持续加载,从不显示页面或任何错误(无 Web 错误代码或 .Net 错误)。无论我是在从外部 IP 还是从 -cloudservicename-.cloudapp.net 远程访问 Azure 本身的 VM 后尝试加载网站,这都是相同的行为。部署到 Azure 时,发布和调试配置都是这种情况。

但是,当 运行 在本地 Azure 模拟器上时,应用程序在调试和发布模式下都可以正常运行。我的云和本地 .cscfg 文件之间没有区别,除了 VPN 配置的 NetworkConfiguration 部分。

云服务从 Visual Studio 部署没有错误,我可以 RDP 到虚拟机并打开 IIS 等没问题,网站和证书的配置看起来很好。

我的申请

我的 Azure 云服务由两个角色组成,一个是托管网站的 Web 角色,另一个是运行各种后台作业的 Worker 角色。

这个项目已经进行了一段时间,过去我已经从不同的机器向 Azure 发布了几次迭代。这是我第一次从新的 Windows 8.1 笔记本电脑上发布,尽管这应该没什么区别。自上一版本以来配置变化很小(一个连接字符串添加到角色)。唯一发生变化的主要事情是我升级到 VS2013 更新 4(从更新 3)和 Azure SDK 2.5(从 2.4)。

如果需要,我可以 post 配置文件,但是鉴于部署确实有效,它们似乎一切正常。

调查:

我已经采取了许多步骤来尝试调查和解决问题。

通过 RDP 连接到服务器没有发现任何直接问题,事件日志中没有 IIS 条目,而且我自己的日志记录似乎没有任何用处(稍后会详细介绍)。

我还启用了 Azure 诊断,但查看返回的日志时,我没有发现任何关于手头问题的日志。

我尝试的下一件事是将远程调试器附加到 Azure VM,这有效,我可以调试项目。我在 Global.asax.vb 中处理的所有方法都设置了断点,包括:

Application_BeginRequest
Application_AuthenticateRequest
Application_Error

请求页面后,Application_BeginRequest 立即被点击,随后是 Application_AuthenticateRequest,正如预期的那样。但是通过 Application_AuthenticateRequest 遵循代码会导致一些奇怪的行为。

在这段代码中,我验证了一个 FormsAuthenticationCookie,如果发现它是什么,将设置 HttpContext.Current.UserThread.CurrentPrincipal。在这种情况下,cookie 是空的,因为用户尚未登录,这意味着 Application_AuthenticateRequest 方法完成。此时可以继续单步执行.Net framework代码,可以看到HttpApplication.ExecuteStep.

成功完成

此时我希望 master_Page_PreLoad 方法或 MasterPage 中的其他预加载事件之一或我自定义的 Page 执行,但是 none他们中的一个被击中。

在让进程处于调试状态几分钟后,最终 Application_Error 被命中,这意味着我的日志记录写入了显然导致错误的异常。这种情况很少发生,但当它发生时,我看到出现了两个不同的错误:


我的日志记录中的第一个错误:

ErrorCode:SubStatus:There is a temporary failure. Please retry later. (One or more specified cache servers are unavailable, which could be caused by busy network or servers. For on-premises cache clusters, also verify the following conditions. Ensure that security permission has been granted for this client account, and check that the AppFabric Caching Service is allowed through the firewall on all cache hosts. Also the MaxBufferSize on the server must be greater than or equal to the serialized object size sent from the client.). Additional Information : The client was trying to communicate with the server: net.tcp://rolename.here:24233.. GUID: 9f85d178-968f-4908-bec4-d1a5f57bb819

at Microsoft.ApplicationServer.Caching.DataCache.ThrowException(ErrStatus errStatus, Guid trackingId, Exception responseException, Byte[][] payload, EndpointID destination) at Microsoft.ApplicationServer.Caching.DataCacheFactory.EstablishConnection(IEnumerable'1 servers, RequestBody request, Func'3 sendMessageDelegate, DataCacheReadyRetryPolicy retryPolicy) at Microsoft.ApplicationServer.Caching.SocketClientProtocol.Initialize(IEnumerable'1 servers) at Microsoft.ApplicationServer.Caching.DataCacheFactory.GetCache(String cacheName, CreateNewCacheDelegate cacheCreationDelegate, DataCacheInitializationViaCopyDelegate initializeDelegate) at Microsoft.Web.DistributedCache.CacheHelpers.RunCacheCreationHooks(CacheConnectingEventArgs fetchingEventArgs, IDataCacheFactory dataCacheFactory, Object sender, EventHandler'1 fetchingHandler, EventHandler'1 fetchedHandler) at Microsoft.Web.DistributedCache.DistributedCacheOutputCacheProvider.CreateInternalProvider(IHttpRuntime httpRuntime, OutputCacheInitializationData initData, IDataCacheFactory dataCacheFactory, EventHandler'1 cacheFetching, EventHandler'1 cacheFetched) at Microsoft.Web.DistributedCache.DistributedCacheOutputCacheProvider.GetInternalProvider() at Microsoft.Web.DistributedCache.DistributedCacheOutputCacheProvider.Get(String key) at System.Web.Caching.OutputCache.Get(String key) at System.Web.Caching.OutputCacheModule.OnEnter(Object source, EventArgs eventArgs) at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

在线调查此错误后,我发现一个 Microsoft 来源(抱歉,我不再有 link)说基本上是 "It is supposed to happen sometimes, don't worry about it",但这感觉不对。我以前在我的开发工作中没有看到过这个错误,但是在他的项目上工作的其他开发人员之一最近在调试中遇到过这个错误。有没有人经历过这种情况或确定我们不必担心?

为了排除这种可能性,我在 Web 角色上关闭了缓存的情况下部署了服务,但这没有任何区别。

这是我在 web.config 中的缓存配置。

  <!--To use the in-role flavor of Windows Azure Cache, set identifier to be the cache cluster role name -->
  <!--To use the Windows Azure Cache Service, set identifier to be the endpoint of the cache cluster -->
  <autoDiscover isEnabled="true" identifier="rolename.here" />

  <!--<localCache isEnabled="true" sync="TimeoutBased" objectCount="100000" ttlValue="300" />-->
  <!--Use this section to specify security settings for connecting to your cache. This section is not required if your cache is hosted on a role that is a part of your cloud service. -->
  <!--<securityProperties mode="Message" sslEnabled="true">
    <messageSecurity authorizationInfo="[Authentication Key]" />
  </securityProperties>-->
</dataCacheClient>


我的日志中记录的第二个错误是:

System.Web.HttpException (0x80004005): Server cannot append header after HTTP headers have been sent. at System.Web.HttpResponse.AppendHeader(String name, String value) at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

这感觉像是副作用而不是问题的原因,但欢迎提出任何意见。


我尝试过的其他东西:

在这一点上我完全不知道该怎么做,我不明白为什么它在调试时工作得很好但在部署时却不工作,以及为什么没有日志更清楚地说明这个问题 - 目前我是甚至不确定要搜索什么才能找到有类似问题的人。

最后一个问题归结为为什么我的页面无法加载?

我要启动我的旧 Windows 7 框备份以从那里部署,看看是否有任何区别。

如果您需要更多信息,请随时询问。

感谢阅读本文并感谢您提供的任何帮助。

请确保缓存库版本与SDK版本匹配。如果版本不匹配,您将收到此错误。