【问题标题】:SignalR applications do not work under IISSignalR 应用程序在 IIS 下无法运行
【发布时间】:2013-06-03 15:37:33
【问题描述】:

我正在尝试在 Visual Studio 2012 中构建 SignalR 应用程序。我的问题是它在 Visual Studio 调试下运行良好(在 Windows 7 上使用 Visual Studio 2012),但是当我尝试在 Windows 上的 IIS 8 上部署应用程序时Server 2012,该应用程序仅显示 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 correctly in Visual Studio,但它们似乎都不起作用。

【问题讨论】:

  • 您是否在控制台中遇到任何错误?打开日志记录 ($.connection.hub.logging = true)。
  • 你的聊天页面是不是叫index.html?还是您的聊天页面被称为不同的名称,而 index.html 只是新网站的默认 IIS 页面?
  • 有完整源代码的最终解决方案吗?

标签: iis signalr iis-8 windows-server-2012


【解决方案1】:

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

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

  • 在服务器上安装和配置了 ASP.NET(如果没有,请参阅脚注)
  • SignalR 库已部署到服务器(Microsoft.AspNet.SignalR.Core.dllMicrosoft.AspNet.SignalR.Owin.dllMicrosoft.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();
    }
    
  • 如果您看到这一点,但没有看到 4.2 或 5.1,则说明您的 javascript 存在问题,阻止调用 $.connection.hub.start() 代码。

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

现在您需要打开client side logging on signalr。在您的 index.html 聊天页面中,您可以看到 $.connection.hub.start().done(function () { 行,添加以下内容,以便代码显示为:

    $.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 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

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

【讨论】:

  • 我也有这个问题,我测试了你建议的步骤。所有这些都可以,但是当我发送消息时,SignalR 日志SignalR: Triggering client hub event... 的最后一行不显示。我不知道怎么了!
  • 我解决了这个问题。那是因为我在服务器端逻辑上的错误。
  • @AmirOveisi 您能否详细说明您的服务器端逻辑的错误是什么?我遇到了类似的问题,尽管检查了上面答案中的所有内容,但仍无法找出原因。
  • @Bruno :据我记得,这是我选择合适的客户通过Hub 更新他们的错误。
  • 谢谢,这是一个很棒的清单。就我而言,有几个问题。首先是由于不存在 signalR min 文件而未提供 JS 文件,其次是应用程序清单文件中需要用于信号连接的条目。
【解决方案2】:

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

我还必须使用 Chrome 而不是 IE 才能使演示应用正常运行。

【讨论】:

    猜你喜欢
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多