如何创建与 "new" SignalR 协议 (Microsoft.AspNetCore.SignalR 1.0.0-*) 兼容的便携式 SignalR 客户端?

How to create a portable SignalR client compatible with "new" SignalR protocol (Microsoft.AspNetCore.SignalR 1.0.0-*)?

我正在检查新的 SignalR(服务器)存储库:https://github.com/aspnet/SignalR 并想知道是否有 new/upcoming 协议格式?我想在可移植的 .NET 平台(例如 netcoreapp1.0)上创建一个示例客户端 运行。有一个示例客户端和服务器(聊天示例),但无法使其工作。它连接到服务器,但一旦我尝试发送消息就会抛出异常(不是很有用"System.ArgumentNullException: Value cannot be null.")

所以我检查了来源并设法发现了新的消息格式。以前是这样的:

{"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" 不再缩短,hub 正在合并到 "Method"

协议的其他部分(协商、连接管理、ping 等)对我来说仍然不确定。有人可以出示一些文件吗?

免责声明:Asp.NET 核心的 SignalR 正在进行中,一切都可能发生变化。

新 SignalR 中没有特定格式。相反,事情是基于我们所说的 'formatters' 和(对于集线器)调用适配器。这个想法是,在集线器的情况下,SignalR 正在处理描述 invocations and invocation results. You need to register an implementation of the IInvocationAdapter that uses formatters to translate data from the wire to invocation descriptors etc. This way SignalR is not tied to any specific format. There will be some default implementations in-the-box - like the one you found for Json but you can provide your own alternative (even for Json) - check the SocketsSample 的实际对象 - 它包含对 Protobuf 和 'line protocol' 的简单支持,其中数据以文本格式作为带有一些标记和逗号的行发送分离值。

目前没有协商本身,但对于非基于 WebSocket 的传输 you need to send an http request to get the connection id. With WebSockets you can connect directly to the server without using any client. (I actually showed a demo recently where I connected a ESP8266 based dev board running lua to a SignalR server over a webSocket and all code was just this - 请注意,这没有使用集线器)