-
-
Notifications
You must be signed in to change notification settings - Fork 175
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
的服务,默认就支持HTTP
和Websocket
如果使用javascript
的websocket
调上以上服务需要遵循相关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 = "[email protected]" };
var frame = mApiServer.CreateDataFrame(result);
mApiServer.SendToWebSocket(frame);
以上代码是广播数据给所有在线连接,SendToWebSocket
还提供重载方法发送给指定的会话连接