Руководство по SignalR Self-Host

Патрик Флетчер

Предупреждение

Эта документация не подходит для последней версии SignalR. Взгляните на ASP.NET Core SignalR.

В этом руководстве показано, как создать локальный сервер SignalR 2 и как подключиться к нему с помощью клиента JavaScript.

Версии программного обеспечения, используемые в руководстве

Использование Visual Studio 2012 с этим руководством

Чтобы использовать Visual Studio 2012 с этим руководством, сделайте следующее:

  • Обновите диспетчер пакетов до последней версии.
  • Установите установщик веб-платформы.
  • В установщике веб-платформы найдите и установите ASP.NET и веб-инструменты 2013.1 для Visual Studio 2012. Будут установлены шаблоны Visual Studio для классов SignalR, таких как Hub.
  • Некоторые шаблоны (например , класс запуска OWIN) не будут доступны; для них используйте вместо него файл класса.

Вопросы и комментарии

Оставьте отзыв о том, как вам понравилось это руководство и что, по вашему мнению, мы можем улучшить в комментариях в нижней части страницы. Если у вас есть вопросы, которые не связаны напрямую с руководством, их можно опубликовать на форуме ASP.NET SignalR или StackOverflow.com.

Обзор

Сервер SignalR обычно размещается в приложении ASP.NET в IIS, но он также может быть размещен самостоятельно (например, в консольном приложении или службе Windows) с помощью локальной библиотеки. Эта библиотека, как и все SignalR 2, основана на OWIN (open Web Interface for .NET). OWIN определяет абстракцию между веб-серверами .NET и веб-приложениями. OWIN отделяет веб-приложение от сервера, что делает OWIN идеальным для самостоятельного размещения веб-приложения в собственном процессе за пределами IIS.

Причины, по которым приложение не размещается в IIS, включают:

  • Среды, в которых службы IIS недоступны или нежелательны, например, существующая ферма серверов без использования IIS.
  • Необходимо избежать издержек производительности IIS.
  • Функция SignalR должна быть добавлена в существующее приложение, которое выполняется в службе Windows, рабочей роли Azure или другом процессе.

Если решение разрабатывается как самостоятельное размещение по соображениям производительности, рекомендуется также протестировать приложение, размещенное в IIS, чтобы определить преимущество производительности.

В этом руководстве содержатся следующие разделы:

Создание сервера

В этом руководстве вы создадите сервер, размещенный в консольном приложении, но сервер может размещаться в любом процессе, например в службе Windows или рабочей роли Azure. Пример кода для размещения сервера SignalR в службе Windows см. в Self-Hosting SignalR в службе Windows.

  1. Откройте Visual Studio 2013 с правами администратора. Выберите файл, новый проект. Выберите Windows под узлом Visual C# в области шаблонов и выберите шаблон консольного приложения . Назовите новый проект SignalRSelfHost и нажмите кнопку "ОК".

    Снимок экрана: экран

  2. Откройте консоль диспетчера пакетов NuGet, выбрав Инструменты>Диспетчер пакетов NuGet>Консоль диспетчера пакетов.

  3. В консоли диспетчера пакетов введите следующую команду:

    Install-Package Microsoft.AspNet.SignalR.SelfHost
    

    Эта команда добавляет библиотеки SignalR 2 Self-Host в проект.

  4. В консоли диспетчера пакетов введите следующую команду:

    Install-Package Microsoft.Owin.Cors
    

    Эта команда добавляет библиотеку Microsoft.Owin.Cors в проект. Эта библиотека будет использоваться для междоменной поддержки, которая требуется для приложений, в которых размещен SignalR и клиент веб-страницы в разных доменах. Так как сервер SignalR и веб-клиент будут размещаться на разных портах, это означает, что для обмена данными между этими компонентами необходимо включить междоменный доступ.

  5. Замените содержимое Program.cs приведенным ниже кодом.

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

    Приведенный выше код включает три класса:

    • Программа, включая метод Main , определяющий основной путь выполнения. В этом методе веб-приложение типа Startup запускается по указанному URL-адресу (http://localhost:8080). Если для конечной точки требуется безопасность, можно реализовать SSL. Дополнительные сведения см. в статье "Практическое руководство. Настройка порта с помощью SSL-сертификата ".
    • Запуск — класс, содержащий конфигурацию сервера SignalR (единственное, что используется в этом руководстве, — это вызов UseCors) и вызов MapSignalR, который создает маршруты для любых объектов Концентратора в проекте.
    • MyHub— класс SignalR Hub, который приложение будет предоставлять клиентам. Этот класс имеет один метод Send, который клиенты будут использовать, чтобы отправить сообщение всем остальным подключенным клиентам.
  6. Скомпилируйте и запустите приложение. Адрес, на котором запущен сервер, должен отображаться в окне консоли.

    Снимок экрана: сервер, работающий в окне консоли.

  7. Если выполнение завершается сбоем System.Reflection.TargetInvocationException was unhandled, необходимо перезапустить Visual Studio с правами администратора.

  8. Остановите приложение, прежде чем перейти к следующему разделу.

Доступ к серверу с помощью клиента JavaScript

В этом разделе описано, как использовать тот же клиент JavaScript из руководства по началу работы. Мы вносим только одно изменение в клиент, который заключается в явном определении URL-адреса концентратора. При использовании локального приложения сервер может не обязательно находиться в том же адресе, что и URL-адрес подключения (из-за обратных прокси-серверов и подсистем балансировки нагрузки), поэтому URL-адрес должен быть определен явным образом.

  1. В обозревателе решений щелкните решение правой кнопкой мыши и выберите "Добавить", "Создать проект". Выберите веб-узел и выберите шаблон веб-приложения ASP.NET . Присвойте проекту имя JavascriptClient и нажмите кнопку "ОК".

    Снимок экрана: экран добавления нового проекта с выделенным веб-узлом, шаблоном веб-приложения S P dot NET и полем

  2. Выберите пустой шаблон и оставьте остальные параметры не выбранными. Выберите Создать проект.

    Снимок экрана экрана нового проекта A S P точка N E T с выбранным пустым шаблоном и выделенным параметром

  3. В консоли диспетчера пакетов выберите проект JavascriptClient в раскрывающемся списке проекта по умолчанию и выполните следующую команду:

    Install-Package Microsoft.AspNet.SignalR.JS
    

    Эта команда устанавливает библиотеки SignalR и JQuery, необходимые клиенту.

  4. Щелкните проект правой кнопкой мыши и выберите "Добавить", "Создать элемент". Выберите веб-узел и выберите HTML-страницу . Назовите страницу Default.html.

    Снимок экрана: экран добавления нового элемента с выделенным веб-параметром, шаблоном страницы H T M L и полем

  5. Замените содержимое новой HTML-страницы следующим кодом. Убедитесь, что ссылки на скрипты соответствуют скриптам в папке "Скрипты" проекта.

    <!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>:&nbsp;&nbsp;' + 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>
    

    Следующий код (выделенный в приведенном выше примере кода) — это дополнение, которое вы сделали клиенту, используемому в руководстве "Получение звездочек" (помимо обновления кода до бета-версии SignalR версии 2). Эта строка кода явно задает базовый URL-адрес подключения для SignalR на сервере.

    //Set the hubs URL for the connection
    $.connection.hub.url = "http://localhost:8080/signalr";
    
  6. Щелкните правой кнопкой мыши решение и выберите "Задать запускаемые проекты...". Выберите переключатель "Несколько запускаемых проектов " и задайте для обоих проектов действие"Пуск".

    Снимок экрана: экран страниц свойств решения с выделенными переключателями

  7. Щелкните правой кнопкой мыши "Default.html" и выберите "Задать как начальную страницу".

  8. Запустите приложение. Сервер и страница будут запущены. Возможно, потребуется перезагрузить веб-страницу (или выбрать "Продолжить в отладчике"), если страница загружается до запуска сервера.

  9. В браузере укажите имя пользователя при появлении запроса. Скопируйте URL-адрес страницы на другую вкладку браузера или окно и укажите другое имя пользователя. Вы сможете отправлять сообщения из одной панели браузера в другую, как в руководстве по началу работы.