Samouczek: samodzielne hostowanie usługi SignalR
Autor : Patrick Fletcher
Ostrzeżenie
Ta dokumentacja nie dotyczy najnowszej wersji usługi SignalR. Przyjrzyj się ASP.NET Core SignalR.
W tym samouczku pokazano, jak utworzyć własny serwer SignalR 2 i jak nawiązać z nim połączenie z klientem JavaScript.
Wersje oprogramowania używane w samouczku
- Visual Studio 2013
- .NET 4.5
- SignalR w wersji 2
Korzystanie z programu Visual Studio 2012 w tym samouczku
Aby używać programu Visual Studio 2012 z tym samouczkiem, wykonaj następujące czynności:
- Zaktualizuj Menedżera pakietów do najnowszej wersji.
- Zainstaluj Instalatora platformy sieci Web.
- W Instalatorze platformy internetowej wyszukaj i zainstaluj ASP.NET and Web Tools 2013.1 dla programu Visual Studio 2012. Spowoduje to zainstalowanie szablonów programu Visual Studio dla klas SignalR, takich jak Hub.
- Niektóre szablony (takie jak klasa początkowa OWIN) nie będą dostępne; w tym celu należy zamiast tego użyć pliku klasy.
Pytania i komentarze
Przekaż opinię na temat tego, jak ci się podobał ten samouczek i co możemy ulepszyć w komentarzach w dolnej części strony. Jeśli masz pytania, które nie są bezpośrednio związane z tym samouczkiem, możesz opublikować je na forum ASP.NET SignalR lub StackOverflow.com.
Omówienie
Serwer SignalR jest zwykle hostowany w aplikacji ASP.NET w usługach IIS, ale może być również hostowany samodzielnie (na przykład w aplikacji konsolowej lub usłudze systemu Windows) przy użyciu biblioteki samodzielnego hosta. Ta biblioteka, podobnie jak wszystkie usługi SignalR 2, jest oparta na interfejsie OWIN (Open Web Interface for .NET). OWIN definiuje abstrakcję między serwerami internetowymi platformy .NET i aplikacjami internetowymi. OWIN rozdziela aplikację internetową z serwera, co sprawia, że OWIN idealnie nadaje się do samodzielnego hostowania aplikacji internetowej we własnym procesie poza usługami IIS.
Przyczyny braku hostingu w usługach IIS obejmują:
- Środowiska, w których usługi IIS są niedostępne lub pożądane, takie jak istniejąca farma serwerów bez usług IIS.
- Należy unikać obciążenia związanego z wydajnością usług IIS.
- Funkcja SignalR ma zostać dodana do istniejącej aplikacji działającej w usłudze systemu Windows, roli procesu roboczego platformy Azure lub w innym procesie.
Jeśli rozwiązanie jest opracowywane jako samodzielne host ze względu na wydajność, zaleca się również przetestowanie aplikacji hostowanej w usługach IIS w celu określenia korzyści z wydajności.
Ten samouczek zawiera następujące sekcje:
Tworzenie serwera
W tym samouczku utworzysz serwer hostowany w aplikacji konsolowej, ale serwer może być hostowany w dowolnym rodzaju procesie, takim jak usługa systemu Windows lub rola procesu roboczego platformy Azure. Przykładowy kod do hostowania serwera SignalR w usłudze systemu Windows można znaleźć w temacie Self-Hosting SignalR in a Windows Service (Samoobsługowe hostowanie usługi SignalR w usłudze systemu Windows).
Otwórz Visual Studio 2013 z uprawnieniami administratora. Wybierz pozycję Plik, Nowy projekt. Wybierz pozycję Windows w węźle Visual C# w okienku Szablony , a następnie wybierz szablon Aplikacja konsolowa . Nadaj nowemu projektowi nazwę "SignalRSelfHost" i kliknij przycisk OK.
Otwórz konsolę menedżera pakietów NuGet, wybierając pozycję Narzędzia>Konsola menedżera>pakietów NuGet.
W konsoli menedżera pakietów wprowadź następujące polecenie:
Install-Package Microsoft.AspNet.SignalR.SelfHost
To polecenie dodaje biblioteki usługi SignalR 2 Self-Host do projektu.
W konsoli menedżera pakietów wprowadź następujące polecenie:
Install-Package Microsoft.Owin.Cors
To polecenie dodaje bibliotekę Microsoft.Owin.Cors do projektu. Ta biblioteka będzie używana do obsługi międzydomenowej, która jest wymagana w przypadku aplikacji hostujących usługę SignalR i klienta strony internetowej w różnych domenach. Ponieważ będziesz hostować serwer SignalR i klienta internetowego na różnych portach, oznacza to, że komunikacja między składnikami musi być włączona między domenami.
Zastąp zawartość pliku Program.cs poniższym kodem.
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); } } }
Powyższy kod zawiera trzy klasy:
- Program, w tym metoda Main definiująca podstawową ścieżkę wykonywania. W tej metodzie aplikacja internetowa typu Startup jest uruchamiana pod określonym adresem URL (
http://localhost:8080
). Jeśli zabezpieczenia są wymagane w punkcie końcowym, można zaimplementować protokół SSL. Aby uzyskać więcej informacji , zobacz Instrukcje: konfigurowanie portu przy użyciu certyfikatu SSL . - Uruchomienie, klasa zawierająca konfigurację serwera SignalR (jedyną konfiguracją używaną w tym samouczku jest wywołanie metody
UseCors
), a wywołanie metodyMapSignalR
, które tworzy trasy dla dowolnych obiektów centrum w projekcie. - MyHub, klasa SignalR Hub, którą aplikacja będzie dostarczać klientom. Ta klasa ma jedną metodę Send, którą klienci będą wywoływać w celu emisji komunikatu do wszystkich innych połączonych klientów.
- Program, w tym metoda Main definiująca podstawową ścieżkę wykonywania. W tej metodzie aplikacja internetowa typu Startup jest uruchamiana pod określonym adresem URL (
Skompiluj i uruchom aplikację. Adres, na którym działa serwer, powinien zostać wyświetlony w oknie konsoli.
Jeśli wykonanie zakończy się niepowodzeniem z wyjątkiem
System.Reflection.TargetInvocationException was unhandled
, należy ponownie uruchomić program Visual Studio z uprawnieniami administratora.Przed przejściem do następnej sekcji zatrzymaj aplikację.
Uzyskiwanie dostępu do serwera za pomocą klienta JavaScript
W tej sekcji użyjesz tego samego klienta JavaScript z samouczka Wprowadzenie. Wprowadzimy tylko jedną modyfikację klienta, która polega na jawnym zdefiniowaniu adresu URL centrum. W przypadku aplikacji hostowanej samodzielnie serwer może niekoniecznie znajdować się pod tym samym adresem co adres URL połączenia (z powodu odwrotnych serwerów proxy i modułów równoważenia obciążenia), dlatego adres URL musi być zdefiniowany jawnie.
W Eksplorator rozwiązań kliknij prawym przyciskiem myszy rozwiązanie i wybierz polecenie Dodaj, Nowy projekt. Wybierz węzeł Sieć Web , a następnie wybierz szablon ASP.NET Aplikacja internetowa . Nadaj projektowi nazwę "JavascriptClient", a następnie kliknij przycisk OK.
Wybierz szablon Pusty i pozostaw pozostałe opcje niezaznaczone. Wybierz pozycję Utwórz projekt.
W konsoli menedżera pakietów wybierz projekt "JavascriptClient" z listy rozwijanej Projekt domyślny i wykonaj następujące polecenie:
Install-Package Microsoft.AspNet.SignalR.JS
To polecenie instaluje biblioteki SignalR i JQuery, które będą potrzebne w kliencie.
Kliknij prawym przyciskiem myszy projekt i wybierz polecenie Dodaj, Nowy element. Wybierz węzeł Sieć Web , a następnie wybierz pozycję Strona HTML. Nadaj stronie nazwę Default.html.
Zastąp zawartość nowej strony HTML następującym kodem. Sprawdź, czy odwołania do skryptu są tutaj zgodne ze skryptami w folderze Scripts projektu.
<!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>
Poniższy kod (wyróżniony w powyższym przykładzie kodu) jest dodatkiem do klienta użytym w samouczku Getting Stared (oprócz uaktualniania kodu do usługi SignalR w wersji 2 beta). Ten wiersz kodu jawnie ustawia podstawowy adres URL połączenia dla usługi SignalR na serwerze.
//Set the hubs URL for the connection $.connection.hub.url = "http://localhost:8080/signalr";
Kliknij rozwiązanie prawym przyciskiem myszy i wybierz polecenie Ustaw projekty startowe.... Wybierz przycisk radiowy Wiele projektów startowych i ustaw opcję Akcja obu projektów na Rozpoczęcie.
Kliknij prawym przyciskiem myszy pozycję "Default.html" i wybierz polecenie Ustaw jako stronę startową.
Uruchom aplikację. Serwer i strona zostaną uruchomione. Może być konieczne ponowne załadowanie strony internetowej (lub wybranie pozycji Kontynuuj w debugerze), jeśli strona zostanie załadowana przed uruchomieniem serwera.
W przeglądarce podaj nazwę użytkownika po wyświetleniu monitu. Skopiuj adres URL strony do innej karty lub okna przeglądarki i podaj inną nazwę użytkownika. Komunikaty można wysyłać z jednego okienka przeglądarki do drugiego, tak jak w samouczku Wprowadzenie.