WebSocket服务

组件默认支持WebSocket,因此并不需要再做专门的配置;默认情况所有控制器都支持WebSocket请求处理,但WebSocket所发送的数据包必须符合特定的规则。以下讲解一下组件WebSocket服务在不同情况下的使用。

定义Websocket控制器

复制代码
    [BeetleX.FastHttpApi.Controller]
    class Program
    {
        private static BeetleX.FastHttpApi.HttpApiServer mApiServer;

        static void Main(string[] args)
        {
            mApiServer = new BeetleX.FastHttpApi.HttpApiServer();
            mApiServer.Debug();
            mApiServer.Register(typeof(Program).Assembly);
            mApiServer.Open();
            Console.Write(mApiServer.BaseServer);
            Console.Read();
        }

        public string Hello(string name)
        {
            return $"{name} {DateTime.Now}";
        }
    }
复制代码

以上是一个Hello World的服务,默认就支持HTTPWebsocket

javascript调用

如果使用javascriptwebsocket调上以上服务需要遵循相关json数据格式的规则。具本格式如下:

{
     url:'/Hello'
     params:{{"name":"henry"}}
}
  • url

    描述请求的方法路径,针对以上示例对应的路径是'/Hello',组件默认大小写不敏感。

  • params

    用于描述方法对应的参数列表

自定义数据接收

组件的服务要求指定的请求格式和对应的响应格式,这样对于一些使用者来说有些限制,如果不希望组件提供的格式而是自己制定数据方式的话可以绑定WebSocket数据接收事件,当事件绑定后组件会把接收的数据直接路由给事件来处理,不会再按原有的方式来解析处理。绑定事件如下:

  mApiServer.WebSocketReceive = (o, e) =>
  {
        Console.WriteLine(e.Frame.Body);
        var freame = e.CreateFrame($"{DateTime.Now}" + e.Frame.Body.ToString());
        e.Response(freame);
 };

不过这里的处理方式还是以文本为主,只是文本的格式解释和输出格式更多的进行控制。

处理非文本数据

默认情况都以文本的方式来处理数据,实际上Websocket是支持二进制流的;如果希望在组件的基础上自己处理二进制流数据需要制定一个数据解析器,解析器的接口规范如下:

复制代码
    public interface IDataFrameSerializer
    {
        object FrameDeserialize(DataFrame data, PipeStream stream);//反序列化对象方法

        ArraySegment<byte> FrameSerialize(DataFrame packet, object body);//序列化方法

        void FrameRecovery(byte[] buffer);//Buffer回收方法

    }
复制代码

组件默认的解析器实现如下:

复制代码
        public virtual object FrameDeserialize(DataFrame data, PipeStream stream)
        {
            return stream.ReadString((int)data.Length);
        }

        private System.Collections.Concurrent.ConcurrentQueue<byte[]> mBuffers = new System.Collections.Concurrent.ConcurrentQueue<byte[]>();

        public virtual ArraySegment<byte> FrameSerialize(DataFrame data, object body)
        {
            byte[] result;
            if (!mBuffers.TryDequeue(out result))
            {
                result = new byte[this.Options.MaxBodyLength];
            }
            string value;
            if (body is string)
                value = (string)body;
            else
                value = Newtonsoft.Json.JsonConvert.SerializeObject(body);
            int length = Options.Encoding.GetBytes(value, 0, value.Length, result, 0);
            return new ArraySegment<byte>(result, 0, length);
        }

        public virtual void FrameRecovery(byte[] buffer)
        {
            mBuffers.Enqueue(buffer);
        }
复制代码

在制定完成数据解析器后把它设置到FrameSerializer属性上即可

HttpApiServer.FrameSerializer= new CustomFrameSerializer();

连接验证

当通过浏览器访问Websocket服务的时候,在连接创建过程存在一个握手通讯包,这个通讯包一般都带有用户的Cookie,通过这个Cookie即可以验证连接的来源,从而确定连接的有效性。组件提供一个WebSocketConnect事件来扩展这个验证机制,事件制定如下:

            mApiServer.WebSocketConnect = (o, e) => {
                //e.Request.Header
                //e.Request.Cookies
                e.Cancel = true;
            };

使用者可以根据实际情况的需要判断对应的数据来确定是否取消当前WebSocket连接。

服务端主动发送

            ActionResult result = new ActionResult();
            result.Data = new { type = "log", message = "henryfan@msn.com" };
            var frame = mApiServer.CreateDataFrame(result);
            mApiServer.SendToWebSocket(frame);

以上代码是广播数据给所有在线连接,SendToWebSocket还提供重载方法发送给指定的会话连接

posted @   beetlex  阅读(642)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
历史上的今天:
2018-09-17 dotnet core高吞吐Http api服务组件FastHttpApi
2014-09-17 azure存储压测的问题(农码主观意识太强被坑了)
点击右上角即可分享
微信分享提示