是什么原因导致SignalR在连接时接收net :: ERR_CONNECTION_RESET?

Der*_*eer 7 signalr

我有一个简单的SingulaR示例,我已经添加到传统的ASP.Net MVC应用程序中.

以下是各个部分:

OWIN启动课程

[assembly: OwinStartup(typeof (Startup))]

namespace MyApp.Web
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

SignalR Hub

using System.Collections.Generic;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;

namespace MyApp.Web
{
    [HubName("podService")]
    public class PodServiceHub : Hub
    {
        public PodServiceHub()
        {
            ;
        }

        public IEnumerable<string> GetMessages()
        {
            return new[] {"blah", "blah", "blah"};
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

服务器端外观

using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;

namespace MyApp.Web
{
    public class PodService
    {
        PodService(IHubConnectionContext<dynamic> clients)
        {
            Clients = clients;
        }

        public PodService()
            : this(GlobalHost.ConnectionManager.GetHubContext<PodServiceHub>().Clients)
        {
        }

        IHubConnectionContext<dynamic> Clients { get; set; }

        public void SendMessageToClient(string message)
        {
            Clients.All.doSomething(message);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

部分启动Javascript:

    var podService = $.connection.podService;

...



    $.extend(podService.client, {
        doSomething: function(message) {
            console.log("received message:" + message);
        }
    });


    // test
    $.connection.hub.start()
        .done(function() {
            podService.server.getMessages()
                .done(function(messages) {
                    console.log("received message:" + message);
                });
        });
Run Code Online (Sandbox Code Playgroud)

在第一页调用的其中一个控制器中:

_podService.SendMessageToClient("Hello from the server!");
Run Code Online (Sandbox Code Playgroud)

执行应用程序时,Chrome的开发工具控制台中会显示以下错误:

WebSocket连接到 'WS://本地主机:62025/signalr /连接运输=的WebSockets&clientProtocol = 1.5&connectionToken = 02LJFqBcRBWKXAOlaSwgMPWG0epV7AFl19gNjFCvA0dxD2QH8%2BC9V028Ehu8fYAFN%2FthPv65JZKfK2MgCEdihCJ0A2dMyENOcdPkhDzEwNB2WQ1X4QXe1fiZAyMbkZ1b&connectionData =%5B%7B%22name%22%3A%22podservice%22%7D%5D&TID = 6'失败:WebSocket握手期间出错:net :: ERR_CONNECTION_RESET

但是,在此错误之后,podService.server.getMessages()返回来自服务器的消息["blah","blah","blah"]到控制台,随后调用doSomething客户端函数打印"收到的消息" :来自服务器的你好!"

来自客户端和服务器的调用都在传输数据,因此这个错误似乎没有破坏应用程序.这绝对是一个问题.上面的代码基于Microsoft.AspNet.SignalR.Sample NuGet包生成的示例代码,该代码不显示相同的行为.我在我的示例和基于NuGet的示例之间了解的唯一区别是,我已将此添加到遗留MVC应用程序与基于纯OWIN的应用程序之间.根据我在这个问题上阅读的评论,这应该不是问题.

那么,这个示例用法和/或可能导致连接重置的原因有什么问题?

Nik*_*Nik 21

我确定:

  1. IIS中启用了Web套接字组件
  2. 并且我的web.config中的"allowKeepAlive"设置未设置为false

但在我的情况下,问题是由软件包版本不匹配引起的:
在packages.config中,Microsoft.Owin.Host.SystemWeb版本2.1.0被意外引用

<package id="Microsoft.Owin.Host.SystemWeb" version="2.1.0" targetFramework="net452" />
Run Code Online (Sandbox Code Playgroud)

虽然所有其他Owin相关软件包都引用了3.0.1版,但
我将Microsoft.Owin.Host.SystemWeb更新为3.0.1版

然后我必须在web.config文件中确保"httpRuntime"元素针对框架版本4.5

  <system.web>
    <httpRuntime targetFramework="4.5" />
  </system.web>
Run Code Online (Sandbox Code Playgroud)

上面的两个步骤解决了这个问题.

  • @Nik的道具,httpRuntime为我做了! (5认同)
  • <httpRuntime targetFramework ="4.5"/>解决了我的问题 (4认同)

phu*_*uzi 1

我自己刚刚遇到了这个。就我而言,答案似乎是为 IIS 启用 WebSockets。

在 IIS 8.0 中启用 WebSocket

它之所以有效,是因为 signalR 根据浏览器和服务器的功能回落到以下之一。

  • 服务器发送事件。
  • 永远的框架
  • AJAX 长轮询

有关所使用的传输及其后备的更多信息,请参阅此处