5

我正在尝试在 Visual Studio 2012 中构建 SignalR 应用程序。我的问题是它在 Visual Studio 调试下运行良好(在 Windows 7 上使用 Visual Studio 2012),但是当我尝试在 Windows Server 2012 上的 IIS 8 上部署应用程序时,该应用程序仅显示 index.html 页面。

我决定尝试缩小问题是在我的代码中还是在 SignalR 中。我编译了http://www.asp.net/signalr/overview/getting-started/tutorial-getting-started-with-signalr中显示的 SignalR 教程。这在 Visual Studio 下工作得很好,但再一次,除了在 IIS 下显示静态页面之外,它什么也不做。

我已经尝试过这里列出的一些方法:Signalr/Hub not loading in IIS 7 but working normal in Visual Studio,但它们似乎都不起作用。

4

2 回答 2

26

假设您实际上想要查看index.html(即您的问题不是“显示空 index.html 而不是我的聊天页面 chat.html”),那么听起来当您在聊天页面中输入内容时它没有显示为连接到聊天的其他浏览器窗口中的聊天。

我会尝试一些基本测试。我将假设:

  • ASP.NET 已在服务器上安装和配置(如果没有,请参阅脚注)
  • SignalR 库部署到服务器(Microsoft.AspNet.SignalR.Core.dllMicrosoft.AspNet.SignalR.Owin.dllMicrosoft.AspNet.SignalR.SystemWeb.dll其他)。

我会尝试以下测试:

  1. 安装Fiddler,或使用浏览器开发工具中的 Network 选项卡(在浏览器中按 F12)。
  2. 浏览到yourdomainnamehere.com/index.html(如果您已经在那里,则重新加载)
  3. 网络跟踪应显示 200(或 304)状态:
    1. 你的页面index.html
    2. 正在下载 jQuery、jQuery.signalR 的 javascript 文件
  4. 至关重要的是,它还应该显示以下返回状态为 200 的连接:
    1. signalr/hubs
    2. signalr/negotiate(带有查询字符串)
  5. 它应该显示与
    1. signalr/connect(带有查询字符串)

所以:

  • 如果您没有看到上面的 3.2,那么您知道没有提供 javascript 文件,因此您需要找出原因(它们是否在服务器上/您的 html 中的路径是否正确)。
  • 如果你看到了,但不是上面的 4.1,那么 ASP.NET 路由有问题。检查您是否将此作为您的第一Application_Start

    protected void Application_Start(object sender, EventArgs e)
    {
        // Register the default hubs route: ~/signalr/hubs
        RouteTable.Routes.MapHubs();
    }
    
  • 如果您看到了这一点,但没有看到 4.2 或 5.1,那么您的 javascript 存在问题,阻止了$.connection.hub.start()代码被调用。

好的,这行得通,现在呢?

现在您需要在 signalr 上打开客户端日志记录。在您看到该$.connection.hub.start().done(function () {行的 index.html 聊天页面中,添加以下内容,以便代码显示为:

    $.connection.hub.logging = true;
    $.connection.hub.start().done(function () {` 

再次打开浏览器开发工具,然后切换到控制台选项卡。现在加载页面并发送聊天。查看您收到的错误消息(如果有)。成功打开页面并发送聊天消息应生成如下日志:

LOG: [12:34:56 UTC+0100] SignalR: Negotiating with '/signalr/negotiate'. 
LOG: [12:34:56 UTC+0100] SignalR: This browser doesn't support SSE. 
LOG: [12:34:56 UTC+0100] SignalR: Binding to iframe's readystatechange event. 
LOG: [12:34:56 UTC+0100] SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332 and a connection lost timeout of 20000 
LOG: [12:34:56 UTC+0100] SignalR: Triggering client hub event 'broadcastMessage' on hub 'ChatHub'. 

脚注:如何测试服务器上是否安装和配置了 ASP.NET

使用您的信号器端点网站,创建一个新页面:

  • 使它成为一个 aspx 网络表单(或一个 mvc 表单)并调用它TestAspNet.aspx
  • 进入TestAspNet.aspx,添加标签控件<asp:Label runat="server" ID="lblTest"></asp:Label>
  • 到后面的代码中,将此代码添加到Page_Loadthis.lblTest.Text = DateTime.Now.ToLongTimeString();

现在将其部署到您的 Web 服务器,然后导航到http://yourdomainnamehere.com/TestAspNet.aspx. 如果这显示您当前的服务器时间,您就知道服务器上安装了 ASP.NET。如果没有,那么有两种选择:

如果您认为另一个站点可能正在使用主机标头,那么您可以使用 powershell 在 Win Server 2102 上轻松检查:

Import-Module WebAdministration
Get-WebBinding |? bindingInformation -match .*mydomainname.com.* | ft protocol, bindingInformation, ItemXPath -AutoSize

站点名称和 ID 显示在结果列下方ItemXPath

于 2013-06-03T20:34:00.170 回答
1

我遇到过同样的问题。通过将应用程序池设置为 ASP.NET v4.0 (v4.0) 对其进行排序。

我还必须使用 Chrome 而不是 IE 才能使演示应用程序正常工作。

于 2014-03-05T14:07:42.613 回答