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

时间:2015-05-26 22:14:11

标签: signalr

我有一个简单的SingulaR示例,我已将其添加到旧版ASP.Net MVC应用程序中。

以下是各个部分:

OWIN启动课程

[assembly: OwinStartup(typeof (Startup))]

namespace MyApp.Web
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR();
        }
    }
}

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"};
        }
    }
}

服务器端外观

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);
        }
    }
}

部分启动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);
                });
        });

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

_podService.SendMessageToClient("Hello from the server!");

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

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

然而,在此错误之后,podService.server.getMessages()返回来自服务器打印的消息[&#34; blah&#34;,&#34; blah&#34;,&#34; blah&# 34;]到控制台,随后调用doSomething客户端函数打印&#34;收到消息:来自服务器的Hello!&#34;。

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

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

4 个答案:

答案 0 :(得分:18)

我确定了:

  1. this
  2. the web socket component is enabled in IIS
  3. 但在我的情况下,问题是由软件包版本不匹配引起的:
    在packages.config中,意外引用了Microsoft.Owin.Host.SystemWeb版本2.1.0

    <package id="Microsoft.Owin.Host.SystemWeb" version="2.1.0" targetFramework="net452" />
    

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

    然后我必须在web.config文件中确保&#34; httpRuntime&#34; element针对框架版本4.5

      <system.web>
        <httpRuntime targetFramework="4.5" />
      </system.web>
    

    上述两个步骤解决了这个问题。

答案 1 :(得分:1)

我自己跑到这个地方。在我的情况下,答案似乎是为IIS启用WebSockets。

Enable WebSockets in IIS 8.0

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

  • 服务器已发送事件。
  • 永远的框架
  • AJAX Long Polling

有关所用传输及其后备的详细信息,请参阅here

答案 2 :(得分:1)

在我的情况下,我不得不删除

<httpProtocol allowKeepAlive="false" />

来自我们的web.config(由于历史原因,它存在)。

答案 3 :(得分:0)

就我而言,我正在使用

var express = require('express');
var router = express.Router();
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'https://bpdts-test-app.herokuapp.com/city/London/users',
  'headers': {
    'accept': 'application/json'
  }
};

request(options, function (error, response) {

  if (error) throw new Error(error);
  //console.log(response.body);
  let userNames = '';

  let obj = response.body;

  // for (let i = 0; i<obj.length; i++){
  //   userNames = obj[0];
  //   console.log(userNames)
  // }
  console.log(obj);
  //console.log(userNames);
  //console.log(response.body[0].id);
  return JSON.stringify(response.body);
});

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: request(options) });
  //console.log(request(options));
});

module.exports = router;

问题是当用户无权连接数据库时访问数据库。