Как создать портативный клиент SignalR, совместимый с новым протоколом SignalR (Microsoft.AspNetCore.SignalR 1.0.0- *)?

Я проверяю новое репозиторий SignalR (сервер): https://github.com/aspnet/SignalR И интересно, есть ли новый / будущий формат протокола? Я хотел создать образец клиента, работающего на портативной платформе .NET (например, netcoreapp1.0). Есть образец клиента и сервера (образец чата), но он не работает. Он подключается к серверу, но выдает исключение, как только я пытаюсь отправить сообщение (бесполезное «System.ArgumentNullException: значение не может быть нулевым»).

Итак, я проверил источник и смог обнаружить новый формат сообщения. Раньше это было так:

{"H": "MyHub", "M": "MyHubMethod", "A": ["This is one input argument"], "I": "0"}

Предполагая, что сервер настроен таким образом:

app.UseSignalR(routes => routes.MapHub<MyHub>("/myhub"));

Клиент настраивается с помощью клиента WebSocket (из пакета System.Net.WebSockets.Client версии 4.3.0)

var ws = new ClientWebSocket();
await ws.ConnectAsync(new Uri("ws://myhost:port/myhub/ws"), CancellationToken.None);

Новый формат сообщения:

{
    "Method": "MyCompany.MyNameSpace.MyHub.MyHubMethod",
    "Arguments": ["This is one input argument"],
    "Id": "0"
}

То есть: "Method", "Arguments" и "Id" больше не укорачиваются, и концентратор объединяется в "Method".

Другие части протокола (переговоры, управление соединением, пинг и т. Д.) Для меня все еще не определены. Может кто-нибудь показать какие-нибудь документы?


person balazska    schedule 14.11.2016    source источник
comment
Не забудьте добавить сервер Nuget для зависимостей разработчиков ASP.NET Core: https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json   -  person balazska    schedule 14.11.2016
comment
Просмотр источников и образцов заставил меня понять, что будут поддерживаться две разные конечные точки: концентраторы и сокеты.   -  person balazska    schedule 14.02.2017
comment
В более новой версии (2017 г., январь) "Method" - это просто имя метода, не нужно добавлять пространство имен + имя класса. Это уже очевидно из пути, так как один концентратор отображается на один путь   -  person balazska    schedule 14.02.2017


Ответы (1)


Отказ от ответственности: SignalR для Asp.NET Core находится в стадии разработки, и все может быть изменено.

В новом SignalR нет специального формата. Скорее, все основано на том, что мы называем «средства форматирования» и (для концентраторов) адаптеры вызова. Идея состоит в том, что в случае концентраторов SignalR работает с реальными объектами, описывающими вызовы и результаты вызова. Вам необходимо зарегистрировать реализацию IInvocationAdapter < / a>, который использует средства форматирования для преобразования данных из сети в дескрипторы вызова и т. д. Таким образом, SignalR не привязан к какому-либо конкретному формату. В коробке будут некоторые реализации по умолчанию - например, та, которую вы нашли для Json, но вы можете предоставить свою собственную альтернативу (даже для Json) - проверьте SocketsSample - содержит упрощенную поддержку Protobuf и 'line protocol', где данные отправляются в текстовом формате в виде строк с некоторыми маркерами и запятой. разделенные значения.

На данный момент нет согласования как такового, кроме транспортов, не основанных на WebSocket https://github.com/aspnet/SignalR/blob/dev/src/Microsoft.AspNetCore.SignalR.Client.TS/Connection.ts#L33-L38. С помощью WebSockets вы можете напрямую подключаться к серверу без использования какого-либо клиента. (На самом деле я недавно показал демонстрацию, в которой я подключил плату разработчика на базе ESP8266 с lua к серверу SignalR через webSocket, и весь код был просто this - обратите внимание, что здесь не использовались концентраторы)

person Pawel    schedule 14.11.2016