SignalR应用程序在IIS下无法运行

Rik*_*son 4 iis signalr iis-8 windows-server-2012

我正在尝试在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没有在IIS 7中加载但在Visual Studio中正常工作,但它们似乎都没有工作.

And*_*own 26

假设你真的想看index.html(即你的问题不是"一个空的index.html显示而不是我的聊天页面chat.html"),那么听起来就像当你在聊天页面输入内容时它没有显示为连接到聊天的其他浏览器窗口中的聊天.

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

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

我会尝试以下测试:

  1. 安装Fiddler,或使用浏览器开发工具中的网络选项卡(在浏览器中按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();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果你看到了,但不是4.2或5.1那么你的javascript就会出现问题,导致$.connection.hub.start()代码被调用.

好的,那有效,现在怎么样?

现在,您需要打开信号器上的客户端登录.在index.html聊天页面中,您可以看到该$.connection.hub.start().done(function () {行,添加以下代码,以便代码显示:

    $.connection.hub.logging = true;
    $.connection.hub.start().done(function () {` 
Run Code Online (Sandbox Code Playgroud)

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

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'. 
Run Code Online (Sandbox Code Playgroud)

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

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

  • 将其设为aspx Web表单(或mvc表单)并调用它TestAspNet.aspx.
  • 进入TestAspNet.aspx,添加标签控件 <asp:Label runat="server" ID="lblTest"></asp:Label>
  • 进入后面的代码,将此代码添加到Page_Load:this.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
Run Code Online (Sandbox Code Playgroud)

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