尽管所有角色实例都处于运行状态,但无法访问 ASP.NET SignalR 应用程序

本文提供有关 ASP.NET SignalR 应用程序无法访问并出现错误“无法访问此页面”的问题的信息。

原始产品版本:API 管理服务
原始 KB 数: 4464839

注意

参考有关 Azure 云服务故障排除系列的文章,这是实验室的第七个方案。 请确保已按照此情况对访问者跟踪器应用程序的实验室设置说明进行操作,以重新创建问题。

现象

访问者跟踪器是一个 ASP.NET SignalR 应用程序,用于跟踪访问网站的访问者数。 但是,由于某种原因,无法通过默认云服务 URL(http://cloudservicelabs.cloudapp.net/)访问应用程序,并在 IE 浏览器中收到错误,指出“无法访问此页面”,尽管角色实例处于运行状态。

访问者跟踪器中应用程序状态的屏幕截图。

故障排除步骤

  1. 关于应用程序和服务可用性,需要检查的第一件事是输入终结点是否正在响应。 默认情况下,始终为云服务 Web 角色打开 HTTP 端口 80,可以使用 PsPing 检查端口 80 是否已打开。

    psping cloudservicelabs.cloudapp.net:80
    
    PsPing v2.01 - PsPing - ping, latency, bandwidth measurement utilityCopyright (C) 2012-2014 Mark RussinovichSysinternals - www.sysinternals.com
    
    Invalid destination address:Host not found.
    

    在此示例中,端口 80 被阻止。

  2. 运行 PortQry 工具,可用于排查 TCP/IP 连接问题,如下所示。 它还采用风格、命令行和 GUI 版本。

    Starting portqry.exe -n cloudservicelabs.cloudapp.net -e 80 -p TCP ...
    
    Querying target system called:
    
    cloudservicelabs.cloudapp.net
    
    Attempting to resolve name to IP address...
    
    Name resolved to 40.124.28.4
    
    querying...
    
    TCP port 80 (http service): FILTEREDportqry.exe -n cloudservicelabs.cloudapp.net -e 80 -p TCP exits with return code 0x00000002.
    

    可以看到Portqry.exe将 TCP/IP 端口 80 的状态报告为“已筛选”状态,这意味着根据本文档阻止 TCP/IP 端口。 若要检查应用程序如何通过 localhost 响应,请启用角色的 RDP 并登录到实例以在本地浏览应用程序。 打开 IIS 时,你可能会发现端口 81 上存在 http 绑定,而不是在默认 http 端口 80 上绑定。 因此,请求未到达 IIS,随后你收到错误“无法访问此页面”,而本地网站则按预期生成。

  3. 浏览端口 81 - (http://cloudservicelabs.cloudapp.net:81/) 上的云服务 URL,并检查结果。 如果失败,请 psping 运行以下命令。

    psping cloudservicelabs.cloudapp.net:81
    
    PsPing v2.01 - PsPing - ping, latency, bandwidth measurement utilityCopyright (C) 2012-2014 Mark RussinovichSysinternals - www.sysinternals.com
    
    TCP connect to 40.124.28.4:81:5 iterations (warmup 1) connecting test:Connecting to 40.124.28.4:81 (warmup): This operation returned because the timeout period expired.
    
    Connecting to 40.124.28.4:81: This operation returned because the timeout period expired.
    Connecting to 40.124.28.4:81: This operation returned because the timeout period expired.
    Connecting to 40.124.28.4:81: This operation returned because the timeout period expired.
    Connecting to 40.124.28.4:81: This operation returned because the timeout period expired.  
    
    TCP connect statistics for 40.124.28.4:81:Sent = 4, Received = 0, Lost = 4 (100% loss),Minimum = 0.00ms, Maximum = 0.00ms, Average = 0.00ms
    

    客户端请求似乎未到达服务器。 在这种情况下,请从客户端和服务器收集同时的网络跟踪以获取整体图片。 在服务器端,你可能看不到从我的客户端计算机到达的任何请求,但从客户端跟踪中,你可能会看到客户端尝试根据 TCP 握手序列发送 SYN 数据包,但服务器未确认它。

    如果上述网络跟踪显示请求被阻止,问题在于谁正在阻止它以及如何阻止它? 可能是防火墙还是 ACL? 检查 云服务解决方案的 ServiceConfiguration.cscfg 文件后,可能会发现存在阻止流量的 ACL 规则。

    <NetworkConfiguration>
    <AccessControls>
    <AccessControl name="ACS">
    <Rule action="deny" description="ACS" order="100" remoteSubnet="0.0.0.0/0" />
    </AccessControl>
    </AccessControls>
    <EndpointAcls>
    <EndpointAcl role="Tracker" endPoint="Endpoint1" accessControl="ACS" />
    </EndpointAcls>
    </NetworkConfiguration>
    
  4. 删除 ACL 规则。

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区