2015-05-26 149 views
5

我有一個簡單的SingulaR示例,我已經添加到傳統的ASP.Net MVC應用程序。什麼原因導致SignalR接收到net :: ERR_CONNECTION_RESET連接?

以下是各個部分:

OWIN啓動類

[assembly: OwinStartup(typeof (Startup))] 

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

SignalR樞紐

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連接到'ws:// localhost: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客戶端函數被調用打印「收到的消息:來自服務器的Hello!」。

來自客戶端和服務器的調用正在傳輸數據,所以這個錯誤似乎沒有打破應用程序。但它絕對是一個問題。上面的代碼基於Microsoft.AspNet.SignalR.Sample NuGet包生成的示例代碼,該包不顯示相同的行爲。我在我的示例和基於NuGet的示例之間唯一的區別是我已經將它添加到舊版MVC應用程序,而不是基於OWIN的純應用程序。根據評論我讀on this SO question這不應該是一個問題。

那麼,這個示例用法有什麼問題和/或什麼可能導致連接重置?

+1

你有沒有找到解決你的問題?我面臨着同樣的... – Dunken

回答

1

剛剛跑到這一個自己。在我看來,答案似乎是啓用IIS的WebSockets。

Enable WebSockets in IIS 8.0

它的工作原理,因爲signalR回落到取決於瀏覽器和服務器的功能,執行下列操作之一。

  • Server Sent Events。
  • 永遠幀
  • AJAX長輪詢

有關傳輸使用的詳細信息和他們的回退看到here

+0

我猜這不是我的情況,因爲Microsoft.AspNet.SignalR.Sample包項目以及我有這個項目都使用IIS Express,但只有我的代碼表現出這種行爲。 –

1

就我而言,我不得不刪除

<httpProtocol allowKeepAlive="false" /> 

我們web.config(它出於歷史原因在那裏)。

+1

我在web.config中沒有這個元素。但是,它在父網站的配置中。刪除它幫助。 –

9

我確信:

  1. the web socket component is enabled in IIS
  2. and the "allowKeepAlive" setting is not set to false in my web.config

但在我的情況下,問題是由包版本不匹配造成的:
在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文件中的「的httpRuntime」元素的目標框架4.5版

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

上面兩個步驟解決了這個問題。

+2

支持@Nik,httpRuntime爲我做了! – shanabus

+0

如果這些都不起作用,請檢查您的站點是否位於反向代理之後,並在可能的情況下測試直接連接。在我的情況下,SignalR websockets與直接連接工作,但反向代理打破它們。 –

+0

解決了我的問題 –

相關問題