Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Предупреждение
Эта документация не подходит для последней версии SignalR. Взгляните на ASP.NET Core SignalR.
В этом документе приведены общие сведения об использовании API хабов для SignalR версии 2 в клиентах JavaScript, таких как браузеры и приложения Windows Store (WinJS).
API Центров SignalR позволяет выполнять удаленные вызовы процедур с сервера к подключенным клиентам и от клиентов к серверу. В коде сервера определяются методы, которые могут вызываться клиентами, и вы вызываете методы, которые выполняются на клиенте. В клиентском коде определяются методы, которые могут вызываться с сервера, и вы вызываете методы, которые выполняются на сервере. SignalR берет на себя всю организацию связи между клиентом и сервером.
SignalR также предлагает API нижнего уровня с именем "Постоянные подключения". Общие сведения о SignalR, Центрах и постоянных подключениях см. в разделе "Общие сведения о SignalR".
Версии программного обеспечения, используемые в этом разделе
- Visual Studio 2017
- .NET 4.5
- SignalR версии 2
Предыдущие версии этого раздела
Сведения о более ранних версиях SignalR см. в разделе SignalR более ранних версий.
Вопросы и комментарии
Оставьте отзыв о том, как вам понравилось это руководство и что, по вашему мнению, мы можем улучшить в комментариях в нижней части страницы. Если у вас есть вопросы, которые не связаны напрямую с руководством, их можно опубликовать на форуме ASP.NET SignalR или StackOverflow.com.
Обзор
Этот документ содержит следующие разделы:
Документация по программе серверов или клиентов .NET см. в следующих ресурсах:
Компонент сервера SignalR 2 доступен только в .NET 4.5 (хотя для SignalR 2 есть клиент .NET на .NET 4.0).
Созданный прокси-сервер и то, что он делает для вас
Вы можете запрограммировать клиент JavaScript для взаимодействия со службой SignalR или без прокси-сервера, который signalR создает для вас. Прокси-сервер помогает вам, упрощая синтаксис кода, который вы используете для подключения, создавая методы, которые вызывает сервер, и осуществляя вызовы методов на сервере.
При написании кода для вызова методов сервера созданный прокси-сервер позволяет использовать синтаксис, который выглядит так, как если бы вы выполняли локальную функцию: вместо этого serverMethod(arg1, arg2)можно написатьinvoke('serverMethod', arg1, arg2). Созданный синтаксис прокси-сервера также включает немедленную и понятную ошибку на стороне клиента при неправильном вводе имени метода сервера. И если вы вручную создаете файл, определяющий прокси-серверы, вы также можете получить поддержку IntelliSense для написания кода, вызывающего методы сервера.
Например, предположим, что на сервере есть следующий класс Hub:
public class ContosoChatHub : Hub
{
public void NewContosoChatMessage(string name, string message)
{
Clients.All.addContosoChatMessageToPage(name, message);
}
}
В следующих примерах кода показано, как выглядит код JavaScript для вызова NewContosoChatMessage метода на сервере и получения вызовов addContosoChatMessageToPage метода с сервера.
С созданным прокси-сервером
var contosoChatHubProxy = $.connection.contosoChatHub;
contosoChatHubProxy.client.addContosoChatMessageToPage = function (name, message) {
console.log(name + ' ' + message);
};
$.connection.hub.start().done(function () {
// Wire up Send button to call NewContosoChatMessage on the server.
$('#newContosoChatMessage').click(function () {
contosoChatHubProxy.server.newContosoChatMessage($('#displayname').val(), $('#message').val());
$('#message').val('').focus();
});
});
Без созданного прокси-сервера
var connection = $.hubConnection();
var contosoChatHubProxy = connection.createHubProxy('contosoChatHub');
contosoChatHubProxy.on('addContosoChatMessageToPage', function(name, message) {
console.log(name + ' ' + message);
});
connection.start().done(function() {
// Wire up Send button to call NewContosoChatMessage on the server.
$('#newContosoChatMessage').click(function () {
contosoChatHubProxy.invoke('newContosoChatMessage', $('#displayname').val(), $('#message').val());
$('#message').val('').focus();
});
});
Когда следует использовать созданный прокси-сервер
Если вы хотите зарегистрировать несколько обработчиков событий для клиентского метода, вызываемого сервером, нельзя использовать созданный прокси-сервер. В противном случае вы можете либо использовать созданный прокси-сервер, либо нет, в зависимости от ваших предпочтений в кодировании. Если вы решили не использовать его, вам не нужно ссылаться на URL-адрес signalr/hubs в элементе в клиентском script коде.
Настройка клиента
Для клиента JavaScript требуются ссылки на jQuery и основной файл JavaScript SignalR. Версия jQuery должна быть версии 1.6.4 или более поздней версии, например 1.7.2, 1.8.2 или 1.9.1. Если вы решите использовать созданный прокси-сервер, вам также потребуется ссылка на созданный файл JavaScript прокси-сервера SignalR. В следующем примере показано, как могут выглядеть ссылки на HTML-странице, которая использует созданный прокси-сервер.
<script src="Scripts/jquery-1.10.2.min.js"></script>
<script src="Scripts/jquery.signalR-2.1.0.min.js"></script>
<script src="signalr/hubs"></script>
Эти ссылки должны быть включены в этот порядок: сначала jQuery, ядро SignalR после этого и прокси-серверы SignalR последними.
Как ссылаться на динамически созданный прокси-сервер
В предыдущем примере ссылка на прокси, созданный SignalR, относится к динамически генерируемому коду JavaScript, а не к физическому файлу. SignalR создает код JavaScript для прокси-сервера на лету и обслуживает его клиенту в ответ на URL-адрес "/signalr/hubs". Если вы указали другой базовый URL-адрес для подключений SignalR на сервере в MapSignalR методе, URL-адрес динамически созданного прокси-файла — это ваш пользовательский URL-адрес с добавлением к нему "/хабов".
Замечание
Для клиентов на JavaScript для Windows 8 (Windows Store) используйте физический прокси-файл вместо динамически созданного. Дополнительные сведения см. в разделе "Создание физического файла для созданного прокси-сервера SignalR " далее в этом разделе.
В представлении Razor MVC 4 или 5 ASP.NET используйте тильду, чтобы ссылаться на корневой каталог приложения в ссылке на файл прокси:
<script src="~/signalr/hubs"></script>
Дополнительные сведения об использовании SignalR в MVC 5 см. в статье "Начало работы с SignalR" и MVC 5.
В представлении ASP.NET MVC 3 Razor используйте Url.Content для ссылки на файл прокси:
<script src="@Url.Content("~/signalr/hubs")"></script>
В приложении веб-форм ASP.NET используйте ResolveClientUrl для ссылки на файл прокси-сервера или зарегистрируйте его с помощью ScriptManager с помощью корневого пути приложения (начиная с тильды):
<script src='<%: ResolveClientUrl("~/signalr/hubs") %>'></script>
В качестве общего правила используйте тот же метод, чтобы указать URL-адрес "/signalr/hubs", используемый для ФАЙЛОВ CSS или JavaScript. Если указать URL-адрес без использования тильды, в некоторых сценариях приложение будет работать правильно при тестировании в Visual Studio с помощью IIS Express, но при развертывании в полной версии IIS произойдет ошибка 404. Дополнительные сведения см. в разделе "Разрешение ссылок на ресурсы уровня корня" в веб-серверах Visual Studio для веб-проектов ASP.NET на сайте MSDN.
При запуске веб-проекта в Visual Studio 2017 в режиме отладки и при использовании Internet Explorer в качестве браузера можно просмотреть прокси-файл в обозревателе решений в разделе "Скрипты".
Чтобы просмотреть содержимое файла, дважды щелкните hubs. Если вы не используете Visual Studio 2012 или 2013 и Internet Explorer или не находитесь в режиме отладки, вы также можете получить содержимое файла, перейдя по URL-адресу "/signalR/hubs". Например, если ваш сайт запущен http://localhost:56699, в браузере перейдите на http://localhost:56699/SignalR/hubs.
Создание физического файла для созданного прокси-сервера SignalR
В качестве альтернативы динамически созданному прокси-серверу можно создать физический файл с кодом прокси-сервера и ссылаться на него. Это может потребоваться для контроля за кэшированием или объединением данных, а также для получения IntelliSense при кодировании вызовов методов сервера.
Чтобы создать прокси-файл, выполните следующие действия.
Установите пакет NuGet Microsoft.AspNet.SignalR.Utils .
Откройте командную строку и перейдите к папке инструментов , содержащей файл SignalR.exe. Папка инструментов находится в следующем расположении:
[your solution folder]\packages\Microsoft.AspNet.SignalR.Utils.2.1.0\toolsВведите следующую команду:
signalr ghp /path:[path to the .dll that contains your Hub class]Путь к .dll обычно является папкой bin в папке проекта.
Эта команда создает файл с именем server.js в той же папке, что и signalr.exe.
Поместите файлserver.js в соответствующую папку в проекте, переименуйте его в соответствии с приложением и добавьте ссылку на нее вместо ссылки signalr/hubs.
Как установить подключение
Прежде чем установить подключение, необходимо создать объект подключения, создать прокси-сервер и зарегистрировать обработчики событий для методов, которые можно вызвать с сервера. При настройке прокси-сервера и обработчиков событий установите подключение путем вызова start метода.
Если вы используете созданный прокси-сервер, вам не нужно создавать объект подключения в собственном коде, так как созданный прокси-код делает это для вас.
Установка подключения (с созданным прокси-сервером)
var contosoChatHubProxy = $.connection.contosoChatHub;
contosoChatHubProxy.client.addContosoChatMessageToPage = function (name, message) {
console.log(userName + ' ' + message);
};
$.connection.hub.start()
.done(function(){ console.log('Now connected, connection ID=' + $.connection.hub.id); })
.fail(function(){ console.log('Could not Connect!'); });
Установка подключения (без созданного прокси-сервера)
var connection = $.hubConnection();
var contosoChatHubProxy = connection.createHubProxy('contosoChatHub');
contosoChatHubProxy.on('addContosoChatMessageToPage', function(userName, message) {
console.log(userName + ' ' + message);
});
connection.start()
.done(function(){ console.log('Now connected, connection ID=' + connection.id); })
.fail(function(){ console.log('Could not connect'); });
Пример кода использует URL-адрес "/signalr" по умолчанию для подключения к службе SignalR. Сведения о том, как указать другой базовый URL-адрес, см. в ASP.NET руководстве по API Центров SignalR — сервер — URL-адрес /signalr.
По умолчанию расположение концентратора — текущий сервер; Если вы подключаетесь к другому серверу, укажите URL-адрес перед вызовом start метода, как показано в следующем примере:
$.connection.hub.url = '<yourbackendurl>;
Замечание
Обычно обработчики событий регистрируются перед вызовом start метода для установления соединения. Если вы хотите зарегистрировать некоторые обработчики событий после установки подключения, это можно сделать, но перед вызовом start метода необходимо зарегистрировать по крайней мере один из обработчиков событий. Одна из причин заключается в том, что в приложении может быть много концентраторов, но вы не хотите вызывать OnConnected событие на каждом концентраторе, если вы собираетесь использовать только один из них. При установке подключения наличие клиентского метода на прокси хаба указывает SignalR активировать событие OnConnected. Если перед вызовом метода start не зарегистрированы обработчики событий, вы сможете выполнять методы на Hub, но метод OnConnected Hub не будет выполнен, и ни один клиентский метод не будет вызван с сервера.
$.connection.hub — это тот же объект, что создает $.hubConnection()
Как видно из примеров, при использовании созданного прокси-сервера $.connection.hub ссылается на объект подключения. Это тот же объект, который вы получаете путем вызова $.hubConnection() , если вы не используете созданный прокси-сервер. Созданный прокси-код создает подключение для вас, выполнив следующую инструкцию:
При использовании созданного прокси-сервера можно делать все, что можно сделать с объектом подключения $.connection.hub, когда вы не используете созданный прокси-сервер.
Асинхронное выполнение метода start
Метод start выполняется асинхронно. Он возвращает объект jQuery Deferred, что означает, что можно добавлять функции обратного вызова, вызывая такие методы, как pipe, doneи fail. Если у вас есть код, который требуется выполнить после установки подключения, например вызов метода сервера, поместите этот код в функцию обратного вызова или вызовите его из функции обратного вызова. Метод обратного вызова .done выполняется после установления подключения и после завершения выполнения любого кода, который содержится в OnConnected методе обработчика событий на сервере.
Если инструкцию "Соединение установлено" из предыдущего примера прописать как следующую строку кода после start вызова метода (не в .done обратном вызове), строка console.log будет выполнена до установки подключения, как показано в следующем примере:
Как установить подключение между доменами
Как правило, если браузер загружает страницу изhttp://contoso.com, подключение SignalR находится в том же домене.http://contoso.com/signalr Если страница из http://contoso.com устанавливает подключение к http://fabrikam.com/signalr, то это междоменная связь. По соображениям безопасности подключения между доменами отключены по умолчанию.
В SignalR 1.x междоменные запросы контролируются одним флагом EnableCrossDomain. Этот флаг управляет запросами JSONP и CORS. Для повышения гибкости все службы поддержки CORS были удалены из серверного компонента SignalR (клиенты JavaScript по-прежнему используют CORS обычно, если он обнаруживает, что браузер поддерживает его), а новое ПО промежуточного слоя OWIN было доступно для поддержки этих сценариев.
Если в клиенте требуется JSONP (для поддержки междоменных запросов в более старых браузерах), необходимо включить его явно, установив для объекта HubConfiguration параметр EnableJSONP в значение true, как показано ниже. JSONP отключен по умолчанию, так как он менее безопасный, чем CORS.
Добавление Microsoft.Owin.Cors в проект: Чтобы установить эту библиотеку, выполните следующую команду в консоли диспетчера пакетов:
Install-Package Microsoft.Owin.Cors
Эта команда добавит в проект версию пакета версии 2.1.0.
Вызов useCors
В следующем фрагменте кода показано, как реализовать междоменные подключения в SignalR 2.
Реализация междоменных запросов в SignalR 2
В следующем коде показано, как включить CORS или JSONP в проекте SignalR 2. Этот пример кода использует Map и RunSignalR вместо MapSignalR, чтобы CORS-посредник выполнялся только для запросов SignalR, требующих поддержки CORS (а не для всего трафика по пути, указанному в MapSignalR.) Map также можно использовать для любого другого ПО промежуточного слоя, которое должно выполняться для определенного префикса URL-адреса, а не для всего приложения.
using Microsoft.AspNet.SignalR;
using Microsoft.Owin.Cors;
using Owin;
namespace MyWebApplication
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
// Branch the pipeline here for requests that start with "/signalr"
app.Map("/signalr", map =>
{
// Setup the CORS middleware to run before SignalR.
// By default this will allow all origins. You can
// configure the set of origins and/or http verbs by
// providing a cors options with a different policy.
map.UseCors(CorsOptions.AllowAll);
var hubConfiguration = new HubConfiguration
{
// You can enable JSONP by uncommenting line below.
// JSONP requests are insecure but some older browsers (and some
// versions of IE) require JSONP to work cross domain
// EnableJSONP = true
};
// Run the SignalR pipeline. We're not using MapSignalR
// since this branch already runs under the "/signalr"
// path.
map.RunSignalR(hubConfiguration);
});
}
}
}
Замечание
Не устанавливайте значение
jQuery.support.corsравным true в вашем коде.
SignalR обрабатывает использование CORS. Установка
jQuery.support.corsв значение true отключает JSONP, поскольку это заставляет SignalR предполагать, что браузер поддерживает CORS.При подключении к URL-адресу localhost Internet Explorer 10 не будет считаться междоменной связью, поэтому приложение будет работать локально с IE 10, даже если вы не включили подключения между доменами на сервере.
Сведения об использовании междоменных подключений с Internet Explorer 9 см. в этом потоке StackOverflow.
Сведения об использовании кросс-доменных подключений с Chrome см. в этом потоке StackOverflow.
Пример кода использует URL-адрес "/signalr" по умолчанию для подключения к службе SignalR. Сведения о том, как указать другой базовый URL-адрес, см. в ASP.NET руководстве по API Центров SignalR — сервер — URL-адрес /signalr.
Настройка подключения
Перед установкой подключения можно указать параметры строки запроса или указать метод транспорта.
Указание параметров строки запроса
Если вы хотите отправить данные на сервер при подключении клиента, можно добавить параметры строки запроса в объект подключения. В следующих примерах показано, как задать параметр строки запроса в клиентском коде.
Задайте значение строки запроса перед вызовом метода start (с созданным прокси-сервером)
$.connection.hub.qs = { 'version' : '1.0' };
Задайте значение строки запроса перед вызовом метода start (без созданного прокси-сервера)
var connection = $.hubConnection();
connection.qs = { 'version' : '1.0' };
В следующем примере показано, как считывать параметр строки запроса в коде сервера.
public class ContosoChatHub : Hub
{
public override Task OnConnected()
{
var version = Context.QueryString['version'];
if (version != '1.0')
{
Clients.Caller.notifyWrongVersion();
}
return base.OnConnected();
}
}
Указание метода транспорта
В рамках процесса подключения клиент SignalR обычно ведет переговоры с сервером, чтобы определить лучший транспорт, поддерживаемый как сервером, так и клиентом. Если вы уже знаете, какой транспорт вы хотите использовать, можно обойти этот процесс согласования, указав метод транспорта при вызове start метода.
Клиентский код, указывающий метод транспорта (с созданным прокси-сервером)
$.connection.hub.start( { transport: 'longPolling' });
Клиентский код, указывающий метод транспорта (без созданного прокси-сервера)
var connection = $.hubConnection();
connection.start({ transport: 'longPolling' });
В качестве альтернативы можно указать несколько транспортных методов в том порядке, в котором вы хотите, чтобы SignalR попробовал их использовать.
Клиентский код, указывающий резервную схему переноса транспорта (с созданным прокси-сервером)
$.connection.hub.start( { transport: ['webSockets', 'longPolling'] });
Клиентский код, указывающий настраиваемую резервную схему транспортировки (без генерированного прокси)
var connection = $.hubConnection();
connection.start({ transport: ['webSockets', 'longPolling'] });
Для указания метода транспорта можно использовать следующие значения:
- "webSockets"
- foreverFrame
- "serverSentEvents"
- "longPolling"
В следующих примерах показано, как определить, какой транспортный протокол используется соединением.
Клиентский код, отображающий метод транспорта, используемый соединением (с созданным прокси-сервером)
$.connection.hub.start().done(function () {
console.log("Connected, transport = " + $.connection.hub.transport.name);
});
Клиентский код, отображающий метод транспорта, используемый подключением (без созданного прокси-сервера)
var connection = $.hubConnection();
connection.hub.start().done(function () {
console.log("Connected, transport = " + connection.transport.name);
});
Сведения о том, как проверить метод транспорта в коде сервера, см. в ASP.NET руководстве по API Центров SignalR — Сервер. Получение сведений о клиенте из свойства Context. Дополнительные сведения о транспорте и резервных механизмах см. в статье "Введение в SignalR - транспорты и резервные механизмы".
Получение прокси-сервера для класса Hub
Каждый объект подключения, который вы создаете, инкапсулирует сведения о подключении к службе SignalR, содержащей один или несколько классов Hub. Чтобы взаимодействовать с классом Hub, используйте прокси-объект, который вы создаете самостоятельно (если вы не используете автоматически созданный прокси-объект) или который создан для вас.
На клиенте имя прокси-сервера — это верблюдья версия имени класса Концентратора. SignalR автоматически делает это изменение таким образом, чтобы код JavaScript соответствовал соглашениям JavaScript.
Класс концентратора на сервере
public class ContosoChatHub : Hub
Получите ссылку на созданный клиентский прокси для хаба
var myHubProxy = $.connection.contosoChatHub
Создать клиентский прокси для Hub класса (без автоматической генерации прокси)
var contosoChatHubProxy = connection.createHubProxy('contosoChatHub');
Если вы аннотируете класс Hub атрибутом HubName, используйте точное имя, не изменяя регистр.
Класс Хаба на сервере с атрибутом HubName
[HubName("ContosoChatHub")]
public class ChatHub : Hub
Получите ссылку на созданный клиентский прокси для хаба
var contosoChatHubProxy = $.connection.ContosoChatHub
Создать клиентский прокси для Hub класса (без автоматической генерации прокси)
var contosoChatHubProxy = connection.createHubProxy('ContosoChatHub');
Как определить методы на клиенте для вызова сервером
Чтобы определить метод, который сервер может вызвать из концентратора, добавьте обработчик событий в прокси-сервер Концентратора с помощью client свойства созданного прокси-сервера или вызовите on метод, если вы не используете созданный прокси-сервер. Параметры могут быть сложными объектами.
Добавьте обработчик событий перед вызовом start метода для установления подключения. (Если вы хотите добавить обработчики событий после вызова start метода, см. примечание в статье " Как установить подключение ранее в этом документе" и использовать синтаксис для определения метода без использования созданного прокси-сервера.)
Сопоставление имен методов выполняется без учета регистра. Например, Clients.All.addContosoChatMessageToPage на сервере будет выполняться AddContosoChatMessageToPage, addContosoChatMessageToPage или addcontosochatmessagetopage на клиенте.
Определение метода на клиенте (с созданным прокси-сервером)
var contosoChatHubProxy = $.connection.contosoChatHub;
contosoChatHubProxy.client.addContosoChatMessageToPage = function (userName, message) {
console.log(userName + ' ' + message);
};
$.connection.hub.start()
.done(function(){ console.log('Now connected, connection ID=' + $.connection.hub.id); })
.fail(function(){ console.log('Could not Connect!'); });
Альтернативный способ определения метода на клиенте (с созданным прокси-сервером)
$.extend(contosoChatHubProxy.client, {
addContosoChatMessageToPage: function(userName, message) {
console.log(userName + ' ' + message);
};
});
Определение метода на клиенте (без созданного прокси-сервера или при добавлении после вызова метода start)
var connection = $.hubConnection();
var contosoChatHubProxy = connection.createHubProxy('contosoChatHub');
contosoChatHubProxy.on('addContosoChatMessageToPage', function(userName, message) {
console.log(userName + ' ' + message);
});
connection.start()
.done(function(){ console.log('Now connected, connection ID=' + connection.id); })
.fail(function(){ console.log('Could not connect'); });
Код сервера, вызывающий метод клиента
public class ContosoChatHub : Hub
{
public void NewContosoChatMessage(string name, string message)
{
Clients.All.addContosoChatMessageToPage(name, message);
}
}
В следующих примерах приведен сложный объект в качестве параметра метода.
Определение метода на клиенте, который принимает сложный объект (с созданным прокси-сервером)
var contosoChatHubProxy = $.connection.contosoChatHub;
contosoChatHubProxy.client.addMessageToPage = function (message) {
console.log(message.UserName + ' ' + message.Message);
});
Определение метода на клиенте, который принимает сложный объект (без созданного прокси-сервера)
var connection = $.hubConnection();
var contosoChatHubProxy = connection.createHubProxy('contosoChatHub');
chatHubProxy.on('addMessageToPage', function (message) {
console.log(message.UserName + ' ' + message.Message);
});
Код сервера, определяющий сложный объект
public class ContosoChatMessage
{
public string UserName { get; set; }
public string Message { get; set; }
}
Код сервера, вызывающий метод клиента с помощью сложного объекта
public void SendMessage(string name, string message)
{
Clients.All.addContosoChatMessageToPage(new ContosoChatMessage() { UserName = name, Message = message });
}
Как вызвать методы сервера из клиента
Чтобы вызвать метод сервера с клиента, используйте свойство server автоматически созданного прокси или метод invoke на прокси Hub, если вы не используете автоматически созданный прокси. Возвращаемое значение или параметры могут быть сложными объектами.
Передайте версию метода в CamelCase на Hub. SignalR автоматически делает это изменение таким образом, чтобы код JavaScript соответствовал соглашениям JavaScript.
В следующих примерах показано, как вызвать метод сервера, который не имеет возвращаемого значения, и как вызвать метод сервера с возвращаемым значением.
Метод сервера без атрибута HubMethodName
public class ContosoChatHub : Hub
{
public void NewContosoChatMessage(ChatMessage message)
{
Clients.All.addContosoChatMessageToPage(message);
}
}
Код сервера, определяющий сложный объект, переданный в параметре
public class ChatMessage
{
public string UserName { get; set; }
public string Message { get; set; }
}
Клиентский код, вызывающий метод сервера (с созданным прокси-сервером)
contosoChatHubProxy.server.newContosoChatMessage({ UserName: userName, Message: message}).done(function () {
console.log ('Invocation of NewContosoChatMessage succeeded');
}).fail(function (error) {
console.log('Invocation of NewContosoChatMessage failed. Error: ' + error);
});
Клиентский код, вызывающий метод сервера (без созданного прокси-сервера)
contosoChatHubProxy.invoke('newContosoChatMessage', { UserName: userName, Message: message}).done(function () {
console.log ('Invocation of NewContosoChatMessage succeeded');
}).fail(function (error) {
console.log('Invocation of NewContosoChatMessage failed. Error: ' + error);
});
Если вы украшали метод Hub атрибутом HubMethodName , используйте это имя без изменения регистра.
Метод сервера с атрибутом HubMethodName
public class ContosoChatHub : Hub
{
[HubMethodName("NewContosoChatMessage")]
public void NewContosoChatMessage(string name, string message)
{
Clients.All.addContosoChatMessageToPage(name, message);
}
}
Клиентский код, вызывающий метод сервера (с созданным прокси-сервером)
contosoChatHubProxy.server.NewContosoChatMessage(userName, message).done(function () {
console.log ('Invocation of NewContosoChatMessage succeeded');
}).fail(function (error) {
console.log('Invocation of NewContosoChatMessage failed. Error: ' + error);
});
Клиентский код, вызывающий метод сервера (без созданного прокси-сервера)
contosoChatHubProxy.invoke('NewContosoChatMessage', userName, message).done(function () {
console.log ('Invocation of NewContosoChatMessage succeeded');
}).fail(function (error) {
console.log('Invocation of NewContosoChatMessage failed. Error: ' + error);
});
В предыдущих примерах показано, как вызвать метод сервера, который не имеет возвращаемого значения. В следующих примерах показано, как вызвать метод сервера с возвращаемым значением.
Код сервера для метода с возвращаемым значением
public class StockTickerHub : Hub
{
public IEnumerable<Stock> GetAllStocks()
{
return _stockTicker.GetAllStocks();
}
}
Класс Stock, используемый для возвращаемого значения
public class Stock
{
public string Symbol { get; set; }
public decimal Price { get; set; }
}
Клиентский код, вызывающий метод сервера (с созданным прокси-сервером)
function init() {
return stockTickerProxy.server.getAllStocks().done(function (stocks) {
$.each(stocks, function () {
var stock = this;
console.log("Symbol=" + stock.Symbol + " Price=" + stock.Price);
});
}).fail(function (error) {
console.log('Error: ' + error);
});
}
Клиентский код, вызывающий метод сервера (без созданного прокси-сервера)
function init() {
return stockTickerProxy.invoke('getAllStocks').done(function (stocks) {
$.each(stocks, function () {
var stock = this;
console.log("Symbol=" + stock.Symbol + " Price=" + stock.Price);
});
}).fail(function (error) {
console.log('Error: ' + error);
});
}
Как обрабатывать события жизненного цикла подключения
SignalR предоставляет следующие события времени существования подключения, которые можно обрабатывать:
-
starting: возникает до отправки любых данных через соединение. -
received: возникает при получении любых данных на соединении. Предоставляет полученные данные. -
connectionSlow: возникает, когда клиент обнаруживает медленное соединение или частые разрывы подключения. -
reconnecting: возникает при начале повторного подключения базового транспорта. -
reconnected: возникает при повторном подключении базового транспорта. -
stateChanged: вызывается при изменении состояния подключения. Предоставляет предыдущее и новое состояние (подключение, подключено, повторное подключение или отключено). -
disconnected: возникает при отключении подключения.
Например, если вы хотите отображать предупреждающие сообщения при возникновении проблем с подключением, которые могут вызвать заметные задержки, обработайте connectionSlow событие.
Обработка события connectionSlow (с созданным прокси-сервером)
$.connection.hub.connectionSlow(function () {
console.log('We are currently experiencing difficulties with the connection.')
});
Обработка события connectionSlow (без созданного прокси-сервера)
var connection = $.hubConnection();
connection.connectionSlow(function () {
console.log('We are currently experiencing difficulties with the connection.')
});
Дополнительные сведения см. в разделе "Понимание и обработка событий жизненного цикла подключения в SignalR".
Обработка ошибок
Клиент JavaScript SignalR предоставляет error событие, для которое можно добавить обработчик. Вы также можете использовать метод fail для добавления обработчика ошибок, возникающих при вызове метода сервера.
Если на сервере нет явного включения подробных сообщений об ошибках, объект исключения, возвращаемый SignalR после ошибки, содержит минимальные сведения об ошибке. Например, если вызов newContosoChatMessage завершается сбоем, сообщение об ошибке в объекте ошибки содержит "There was an error invoking Hub method 'contosoChatHub.newContosoChatMessage'." Отправка подробных сообщений об ошибках клиентам в рабочей среде не рекомендуется по соображениям безопасности, но если вы хотите включить подробные сообщения об ошибках для устранения неполадок, используйте следующий код на сервере.
var hubConfiguration = new HubConfiguration();
hubConfiguration.EnableDetailedErrors = true;
app.MapSignalR(hubConfiguration);
В следующем примере показано, как добавить обработчик для события ошибки.
Добавление обработчика ошибок (с созданным прокси-сервером)
$.connection.hub.error(function (error) {
console.log('SignalR error: ' + error)
});
Добавление обработчика ошибок (без созданного прокси-сервера)
var connection = $.hubConnection();
connection.error(function (error) {
console.log('SignalR error: ' + error)
});
В следующем примере показано, как обрабатывать ошибку из вызова метода.
Обработка ошибки при вызове метода (с созданным прокси)
contosoChatHubProxy.newContosoChatMessage(userName, message)
.fail(function(error) {
console.log( 'newContosoChatMessage error: ' + error)
});
Обработка ошибки из вызова метода (без созданного прокси-сервера)
contosoChatHubProxy.invoke('newContosoChatMessage', userName, message)
.fail(function(error) {
console.log( 'newContosoChatMessage error: ' + error)
});
Если вызов метода завершается ошибкой, событие error также вызывается, поэтому ваш код в обработчике метода error и в обратном вызове метода .fail будет выполняться.
Как включить ведение журнала на стороне клиента
Чтобы включить ведение журнала на стороне клиента в соединении, задайте logging свойство объекта подключения перед вызовом start метода для установления подключения.
Включение ведения журнала (с созданным прокси-сервером)
$.connection.hub.logging = true;
$.connection.hub.start();
Включение ведения журнала (без созданного прокси-сервера)
var connection = $.hubConnection();
connection.logging = true;
connection.start();
Чтобы просмотреть журналы, откройте средства разработчика браузера и перейдите на вкладку "Консоль". Для получения пошаговых инструкций и снимков экрана, показывающих, как это сделать, см. раздел "Трансляция сервера с использованием ASP.NET Signalr — включение ведения журнала".