2016-11-14 3 views
0

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

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

{"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".

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

+0

Не забудьте добавить сервер Nuget для зависимостей ASP.NET Core dev: 'https: // dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json' – balazska

+0

Просмотр источников и образцов позволил мне понять, что два разных конечных точки будут поддерживается: концентраторы и сокеты – balazska

+0

Начиная с более новой версии (2017. январь), метод «" - это просто имя метода, не нужно добавлять имя пространства + имя класса. Это уже очевидно из пути, поскольку один хаб отображается на один путь – balazska

ответ

1

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

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

Пока нет переговоров как таковых, но для транспортных средств на основе не-WebSocket you need to send an http request to get the connection id. С помощью WebSockets вы можете напрямую подключаться к серверу без использования какого-либо клиента. (Недавно я показал демонстрационную версию, где я подключил на основе ESP8266 dev до версии lua на сервере SignalR через webSocket, и весь код был всего this - обратите внимание, что это не использовало концентраторы)