Tutorial: Selfhosten von SignalR
von Patrick Fletcher
Warnung
Diese Dokumentation ist nicht für die neueste Version von SignalR vorgesehen. Sehen Sie sich ASP.NET Core SignalR an.
In diesem Tutorial erfahren Sie, wie Sie einen selbstgehosteten SignalR 2-Server erstellen und eine Verbindung mit einem JavaScript-Client herstellen.
Im Tutorial verwendete Softwareversionen
- Visual Studio 2013
- .NET 4.5
- SignalR Version 2
Verwenden von Visual Studio 2012 in diesem Tutorial
Gehen Sie wie folgt vor, um Visual Studio 2012 mit diesem Tutorial zu verwenden:
- Aktualisieren Sie Ihren Paket-Manager auf die neueste Version.
- Installieren Sie den Webplattform-Installer.
- Suchen Sie im Webplattform-Installer nach ASP.NET and Web Tools 2013.1 für Visual Studio 2012, und installieren Sie sie. Dadurch werden Visual Studio-Vorlagen für SignalR-Klassen wie Hub installiert.
- Einige Vorlagen (z. B. die OWIN-Startklasse) sind nicht verfügbar. Verwenden Sie für diese stattdessen eine Klassendatei.
Fragen und Kommentare
Bitte hinterlassen Sie Feedback darüber, wie Ihnen dieses Tutorial gefallen hat und was wir in den Kommentaren unten auf der Seite verbessern könnten. Wenn Sie Fragen haben, die sich nicht direkt auf das Tutorial beziehen, können Sie diese im ASP.NET SignalR-Forum oder im StackOverflow.com posten.
Übersicht
Ein SignalR-Server wird in der Regel in einer ASP.NET-Anwendung in IIS gehostet, kann aber auch selbst gehostet werden (z. B. in einer Konsolenanwendung oder einem Windows-Dienst) mithilfe der Selbsthostbibliothek. Diese Bibliothek basiert, wie alle Von SignalR 2, auf OWIN (Open Web Interface for .NET). OWIN definiert eine Abstraktion zwischen .NET-Webservern und Webanwendungen. OWIN entkoppelt die Webanwendung vom Server, wodurch OWIN ideal für das Selbsthosting einer Webanwendung in Ihrem eigenen Prozess außerhalb von IIS ist.
Gründe für das Nichthosten in IIS sind:
- Umgebungen, in denen IIS nicht verfügbar oder wünschenswert ist, z. B. eine vorhandene Serverfarm ohne IIS.
- Der Leistungsaufwand von IIS muss vermieden werden.
- SignalR-Funktionalität soll einer vorhandenen Anwendung hinzugefügt werden, die in einem Windows-Dienst, einer Azure-Workerrolle oder einem anderen Prozess ausgeführt wird.
Wenn eine Lösung aus Leistungsgründen als Selbsthost entwickelt wird, empfiehlt es sich, auch die in IIS gehostete Anwendung zu testen, um den Leistungsvorteil zu ermitteln.
Dieses Tutorial enthält die folgenden Abschnitte:
Erstellen des Servers
In diesem Tutorial erstellen Sie einen Server, der in einer Konsolenanwendung gehostet wird, aber der Server kann in jeder Art von Prozess gehostet werden, z. B. einem Windows-Dienst oder einer Azure-Workerrolle. Beispielcode zum Hosten eines SignalR-Servers in einem Windows-Dienst finden Sie unter Self-Hosting SignalR in einem Windows-Dienst.
Öffnen Sie Visual Studio 2013 mit Administratorrechten. Wählen Sie Datei, Neues Projekt aus. Wählen Sie windows unter dem Knoten Visual C# im Bereich Vorlagen und dann die Vorlage Konsolenanwendung aus. Nennen Sie das neue Projekt "SignalRSelfHost", und klicken Sie auf OK.
Öffnen Sie die NuGet-Paket-Manager-Konsole, indem Sie Extras> NuGet-Paket-Manager-Paket-Manager-Paket-Manager-Konsole> auswählen.
Geben Sie in der Paket-Manager-Konsole den folgenden Befehl ein:
Install-Package Microsoft.AspNet.SignalR.SelfHost
Dieser Befehl fügt dem Projekt die SignalR 2-Self-Host-Bibliotheken hinzu.
Geben Sie in der Paket-Manager-Konsole den folgenden Befehl ein:
Install-Package Microsoft.Owin.Cors
Mit diesem Befehl wird dem Projekt die Microsoft.Owin.Cors-Bibliothek hinzugefügt. Diese Bibliothek wird für die domänenübergreifende Unterstützung verwendet, die für Anwendungen erforderlich ist, die SignalR und einen Webseitenclient in verschiedenen Domänen hosten. Da Sie den SignalR-Server und den Webclient an verschiedenen Ports hosten, bedeutet dies, dass die domänenübergreifende Kommunikation zwischen diesen Komponenten aktiviert werden muss.
Ersetzen Sie den Inhalt von "Program.cs" durch den folgenden Code.
using System; using Microsoft.AspNet.SignalR; using Microsoft.Owin.Hosting; using Owin; using Microsoft.Owin.Cors; namespace SignalRSelfHost { class Program { static void Main(string[] args) { // This will *ONLY* bind to localhost, if you want to bind to all addresses // use http://*:8080 to bind to all addresses. // See http://msdn.microsoft.com/library/system.net.httplistener.aspx // for more information. string url = "http://localhost:8080"; using (WebApp.Start(url)) { Console.WriteLine("Server running on {0}", url); Console.ReadLine(); } } } class Startup { public void Configuration(IAppBuilder app) { app.UseCors(CorsOptions.AllowAll); app.MapSignalR(); } } public class MyHub : Hub { public void Send(string name, string message) { Clients.All.addMessage(name, message); } } }
Der obige Code enthält drei Klassen:
- Programm, einschließlich der Main-Methode , die den primären Ausführungspfad definiert. Bei dieser Methode wird eine Webanwendung vom Typ Startup an der angegebenen URL (
http://localhost:8080
) gestartet. Wenn Sicherheit für den Endpunkt erforderlich ist, kann SSL implementiert werden. Weitere Informationen finden Sie unter Vorgehensweise: Konfigurieren eines Ports mit einem SSL-Zertifikat . - Start, die Klasse, die die Konfiguration für den SignalR-Server enthält (die einzige Konfiguration, die in diesem Tutorial verwendet wird, ist der Aufruf
UseCors
von ) und der Aufruf vonMapSignalR
, der Routen für alle Hub-Objekte im Projekt erstellt. - MyHub, die SignalR Hub-Klasse, die die Anwendung für Clients bereitstellt. Diese Klasse verfügt über eine einzelne Methode, Send, die Clients aufrufen, um eine Nachricht an alle anderen verbundenen Clients zu übertragen.
- Programm, einschließlich der Main-Methode , die den primären Ausführungspfad definiert. Bei dieser Methode wird eine Webanwendung vom Typ Startup an der angegebenen URL (
Kompilieren Sie die Anwendung, und führen Sie sie aus. Die Adresse, die auf dem Server ausgeführt wird, sollte in einem Konsolenfenster angezeigt werden.
Wenn die Ausführung mit der Ausnahme
System.Reflection.TargetInvocationException was unhandled
fehlschlägt, müssen Sie Visual Studio mit Administratorrechten neu starten.Beenden Sie die Anwendung, bevor Sie mit dem nächsten Abschnitt fortfahren.
Zugreifen auf den Server mit einem JavaScript-Client
In diesem Abschnitt verwenden Sie denselben JavaScript-Client aus dem tutorial Erste Schritte. Wir nehmen nur eine Änderung am Client vor, d. h. explizit die Hub-URL zu definieren. Bei einer selbstgehosteten Anwendung befindet sich der Server möglicherweise nicht unbedingt an derselben Adresse wie die Verbindungs-URL (aufgrund von Reverseproxys und Lastenausgleichsmodulen), sodass die URL explizit definiert werden muss.
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf die Projektmappe, und wählen Sie Hinzufügen, Neues Projekt aus. Wählen Sie den Knoten Web und dann die Vorlage ASP.NET Webanwendung aus. Nennen Sie das Projekt "JavascriptClient", und klicken Sie auf OK.
Wählen Sie die Vorlage Leere aus, und lassen Sie die verbleibenden Optionen nicht ausgewählt. Wählen Sie Create Project (Projekt erstellen) aus.
Wählen Sie in der Paket-Manager-Konsole in der Dropdownliste Standardprojekt das Projekt "JavascriptClient" aus, und führen Sie den folgenden Befehl aus:
Install-Package Microsoft.AspNet.SignalR.JS
Mit diesem Befehl werden die SignalR- und JQuery-Bibliotheken installiert, die Sie im Client benötigen.
Klicken Sie mit der rechten Maustaste auf Ihr Projekt, und wählen Sie Hinzufügen, Neues Element aus. Wählen Sie den Knoten Web und dann HTML-Seite aus. Benennen Sie die Seite Default.html.
Ersetzen Sie den Inhalt der neuen HTML-Seite durch den folgenden Code. Stellen Sie sicher, dass die Skriptverweise hier mit den Skripts im Ordner Skripts des Projekts übereinstimmen.
<!DOCTYPE html> <html> <head> <title>SignalR Simple Chat</title> <style type="text/css"> .container { background-color: #99CCFF; border: thick solid #808080; padding: 20px; margin: 20px; } </style> </head> <body> <div class="container"> <input type="text" id="message" /> <input type="button" id="sendmessage" value="Send" /> <input type="hidden" id="displayname" /> <ul id="discussion"></ul> </div> <!--Script references. --> <!--Reference the jQuery library. --> <script src="Scripts/jquery-1.6.4.min.js"></script> <!--Reference the SignalR library. --> <script src="Scripts/jquery.signalR-2.1.0.min.js"></script> <!--Reference the autogenerated SignalR hub script. --> <script src="http://localhost:8080/signalr/hubs"></script> <!--Add script to update the page and send messages.--> <script type="text/javascript"> $(function () { //Set the hubs URL for the connection $.connection.hub.url = "http://localhost:8080/signalr"; // Declare a proxy to reference the hub. var chat = $.connection.myHub; // Create a function that the hub can call to broadcast messages. chat.client.addMessage = function (name, message) { // Html encode display name and message. var encodedName = $('<div />').text(name).html(); var encodedMsg = $('<div />').text(message).html(); // Add the message to the page. $('#discussion').append('<li><strong>' + encodedName + '</strong>: ' + encodedMsg + '</li>'); }; // Get the user name and store it to prepend to messages. $('#displayname').val(prompt('Enter your name:', '')); // Set initial focus to message input box. $('#message').focus(); // Start the connection. $.connection.hub.start().done(function () { $('#sendmessage').click(function () { // Call the Send method on the hub. chat.server.send($('#displayname').val(), $('#message').val()); // Clear text box and reset focus for next comment. $('#message').val('').focus(); }); }); }); </script> </body> </html>
Der folgende Code (hervorgehoben im obigen Codebeispiel) ist die Ergänzung, die Sie dem Client hinzugefügt haben, der im Tutorial Zum Abrufen von Stared verwendet wird (zusätzlich zum Upgraden des Codes auf SignalR Version 2 Beta). Diese Codezeile legt explizit die Basisverbindungs-URL für SignalR auf dem Server fest.
//Set the hubs URL for the connection $.connection.hub.url = "http://localhost:8080/signalr";
Klicken Sie mit der rechten Maustaste auf die Projektmappe, und wählen Sie Startprojekte festlegen... aus. Wählen Sie das Optionsfeld Mehrere Startprojekte aus, und legen Sie die Aktion beider Projekte auf Start fest.
Klicken Sie mit der rechten Maustaste auf "Default.html", und wählen Sie Als Startseite festlegen aus.
Führen Sie die Anwendung aus. Der Server und die Seite werden gestartet. Möglicherweise müssen Sie die Webseite neu laden (oder im Debugger Weiter auswählen), wenn die Seite geladen wird, bevor der Server gestartet wird.
Geben Sie im Browser einen Benutzernamen an, wenn Sie dazu aufgefordert werden. Kopieren Sie die URL der Seite in eine andere Browserregisterkarte oder ein anderes Browserfenster, und geben Sie einen anderen Benutzernamen an. Sie können Nachrichten aus einem Browserbereich an den anderen senden, wie im Erste Schritte-Tutorial.