2015-05-26 12 views
5

Ich habe ein einfaches SingulaR-Beispiel, das ich zu einer älteren ASP.Net MVC-Anwendung hinzugefügt habe.Was bewirkt, dass SignalR beim Verbinden net :: ERR_CONNECTION_RESET empfängt?

Hier sind die verschiedenen Teile:

OWIN Startup Klasse

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

serverseitige Fassade

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

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

Innerhalb einer der Controller von der ersten Seite aufgerufen:

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

Bei der Anwendung ausgeführt wird, wird der folgende Fehler in der Konsole angezeigt der Chrome-Entwicklungstools:

WebSocket-Verbindung zu 'ws: // localhost: 62025/signager /? Verbinden transport = WebSockets & client = 1,5 & connectionToken = 02LJFqBcRBWKXAOlaSwgMPWG0epV7AFl19gNjFCvA0dxD2QH8% 2BC9V028Ehu8fYAFN% 2FthPv65JZKfK2MgCEdihCJ0A2dMyENOcdPkhDzEwNB2WQ1X4QXe1fiZAyMbkZ1b & connection =% 5B% 7B% 22name% 22% 3A% 22podservice% 22% 7D% 5D & tid = 6' fehlgeschlagen: Fehler bei der WebSocket Handshake : net :: ERR_CONNECTION_RESET

Nach diesem Fehler kehrt jedoch podService.server.getMessages() mit der Nachricht vom Server [blah "," blah "," blah "] zur Konsole zurück und anschließend die doSomething client function wird aufgerufen, indem "empfangene Nachricht: Hallo vom Server!" gedruckt wird.

Die Anrufe vom Client und vom Server übertragen Daten, daher scheint dieser Fehler die App nicht zu beschädigen. Es scheint jedoch ein Problem zu sein. Der obige Code basiert auf dem Beispielcode, der von dem Microsoft.AspNet.SignalR.Sample NuGet-Paket generiert wird, das das gleiche Verhalten nicht anzeigt. Der einzige Unterschied, den ich zwischen meinem Beispiel und dem NuGet-basierten Beispiel kenne, ist, dass ich dies zu einer alten MVC-App im Vergleich zu einer reinen OWIN-basierten App hinzugefügt habe. Basierend auf einem Kommentar, den ich gelesen habe on this SO question sollte dies kein Problem sein.

Also, was ist falsch mit diesem Beispiel Verwendung und/oder was könnte die Verbindung zurückgesetzt verursachen?

+1

Haben Sie jemals eine Lösung für Ihr Problem gefunden? Ich habe das gleiche ... – Dunken

Antwort

1

Gerade lief ich zu diesem selbst ein. In meinem Fall scheint die Antwort das Aktivieren von WebSockets für IIS zu sein.

Enable WebSockets in IIS 8.0

Es funktioniert, weil signalR zurück auf eine der folgenden fällt auf die Funktionen des Browsers und Server abhängig.

  • Server gesendet Ereignisse.
  • immer
  • AJAX Lange Polling

Weitere Informationen zu den verwendeten Transporte Rahmen und ihre Fallbacks here

+0

Ich vermute, das ist in meinem Fall nicht der Fall, da sowohl das Microsoft.AspNet.SignalR.Sample-Paket-Projekt als auch das Projekt, in dem ich dies hatte, beide IIS Express verwendeten, aber nur mein Code manifestierte dieses Verhalten. –

1

In meinem Fall zu sehen, hatte ich

<httpProtocol allowKeepAlive="false" /> 

unserer entfernen web.config (es war aus historischen Gründen da).

+1

Ich hatte dieses Element nicht in der web.config. Es war jedoch in der Konfiguration der übergeordneten Website. Entfernen half. –

9

ich sicher:

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

Aber in meinem Fall wurde das Problem durch einen Paket Versionskonflikt verursacht:
Im packages.config Microsoft.Owin. Host.SystemWeb Version 2.1.0 wurde versehentlich referenziert

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

Während alle anderen Owin verwandte Pakete Version Referenzierung wurden 3.0.1
I aktualisiert Microsoft.Owin.Host.SystemWeb auf Version 3.0.1

Dann musste ich in der web.config stellen Sie sicher, Datei die " Httpruntime“Element zielten auf die Framework-Version 4,5

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

die beiden oben genannten Schritte das Problem gelöst.

+2

Requisiten auf @Nik, die httpRuntime hat es für mich gemacht! – shanabus

+0

Wenn keine dieser Optionen hilfreich ist, überprüfen Sie, ob sich Ihre Site hinter einem Reverse-Proxy befindet, und testen Sie nach Möglichkeit eine direkte Verbindung. In meinem Fall arbeiten SignalR websockets mit einer direkten Verbindung, aber der Reverse Proxy bricht sie. –

+0

löste mein Problem –

Verwandte Themen