消息处理器


  消息处理器类似于 SignalR 的 Hub,是用来接收消息和发送消息的中间件。你只要继承 WebSocketHandler 类然后像 SignalR Hub 一样添加方法即可。如下所示:

public class NotifyHandler : WebSocketHandler
{
    // 给所有人发消息
    public async Task Notify(string message)
    {
        await Clients.All.SendAsync("OnNotify", message);
    }

    // 多参数,返回值,其他人接收
    public async Task<string> NotifyAndRet(int msgId, string message)
    {
        await Clients.Other.SendAsync("OnNotify", message);
        return "ok " + msgId;
    }

    // 接收对象
    public async Task<string> NotifyMessage(Message msg)
    {
        await Clients.All.SendAsync("OnNotify", msg.Content);
        return "ok " + msg.MsgId;
    }

    // 发送给群组
    public async Task<string> NotifyToGroup(string group, string message)
    {
        await Clients.Group(group).SendAsync("OnNotify", message);
        return "ok";
    }
}

  以上的示例中,Handler 收到消息后,会给所有人进行转发。除了使用 All,你还可以使用 Other 给自己之外的其他人进行转发,使用 Group 针对组进行转发。


💡 关于消息的数据协议

  WebSocket 消息的协议定义如下:

{ "M": "方法名", "A": [参数列表], "D": 方向(0或1), "R": 是否有返回值(0或1) }

  说明:方向 0 表示发送消息,1 表示返回消息。

  如以上示例中,对于服务端,各方法所接收到的消息结构如下:

// Task Notify(string message)
{ "M": "Notify", A: ["放假通知:五一放假期间请不要外出。"]}

// Task<string> NotifyAndRet(int msgId, string message)
{ "M": "NotifyAndRet", A: [100222, "放假通知:五一放假期间请不要外出。"]}

// Task<string> NotifyMessage(Message msg)
{ "M": "NotifyMessage", A: [{ "MsgId": 100222, "Content": "放假通知:五一放假期间请不要外出。" }]}

// Task<string> NotifyToGroup(string group, string message)
{ "M": "NotifyToGroup", A: ["同学", "放假通知:五一放假期间请不要外出。"]}

  对于对应的客户端,会收到一条消息通知,消息结构如下:

{ "M": "OnNotify", "D": 0, "A": ["放假通知:五一放假期间请不要外出。"], "R": 0}

  对于有返回值的方法,客户端还会收到一条 R = 1 的消息,A 中的对象即是返回值。结构如下:

// Task<string> NotifyAndRet(int msgId, string message)
{ "M": "NotifyAndRet", "D": 1, "A": ["ok 100222"], "R": 1 }

// Task<string> NotifyMessage(Message msg)
{ "M": "NotifyMessage", "D": 1, "A": ["ok 100222"], "R": 1 }

  消息的序列化反序列化可以通过重新实现 IMessageFormatter 接口并在 WebSocketBuildOption 参数里进行实例化。