asp.net mvc 通过api来实现websocket通信
2017-08-25 10:19
239 查看
asp.net mvc 通过api来实现websocket通信
如果要按照本实例来实现websocket通信,那么必须确认iis是8.0版本及以上,因为低版本好像不支持这种实现方式。创建API控制器MessageSendController;
在控制器下创建GET方法来实现websocket的初始化,首选判断前端访问时发是websokcet访问
if (HttpContext.Current.IsWebSocketRequest),如果是就初始化HttpContext.Current.AcceptWebSocketRequest(Websockets);
创建Websockets方法用来实现接收和发送消息,具体代码如下
public static List<Models.socketMod> Listws = new List<socketMod>(); private async Task Websockets(AspNetWebSocketContext arg) { var web = arg.WebSocket; while (true) { //ArraySegment数组的小抽屉,用于对该数组中元素的范围进行分隔 ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[1024]); //开始接收 WebSocketReceiveResult result = await web.ReceiveAsync(buffer, CancellationToken.None); //判断通信状态是否是打开的 if (web.State == WebSocketState.Open) { string message = Encoding.UTF8.GetString(buffer.Array, 0, result.Count); //这里可以自己自定义,我当时是用于前端可以做出停止指令来操作控制后台的任务,所以这样写 if(message.Contains("停止")) { var id = message.Split('|').LastOrDefault()?.ObjTolong(); var mesd = Listws.FirstOrDefault(p => p.userid == id); mesd.isstop = true; } //这里是接收前端发来的消息,然后做判断的,其中socketMod是自定义的一个实体类,用来存储与客户端连接的信息,比如后台消息要发送到前台时要通过唯一id来在此实体类数组里查找,然后进行指定发送到哪个客户端上,这个可以用来存放在CallContext(线程里唯一)里,这样可以做成简单的聊天器。 if (message.ObjTolong() > 0&&!Listws.Exists(p=>p.userid==message.ObjTolong())) { var md=new Models.socketMod(); md.SecWebSocketKey = arg.SecWebSocketKey; md.userid = message.ObjTolong(); md.webst = web; Listws.Add(md); } var mes = new BLL.mescontent(); mes.jdt = "0"; mes.mess = "成功连接 :" + DateTime.Now.ToLongTimeString(); buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(mes.MToString())); //发送消息到前台,这里可以通过调用Listws实体类数组来指定发送或群发 await web.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None); } else { if (Listws.Exists(p=>p.SecWebSocketKey==arg.SecWebSocketKey)) { Listws.Remove(Listws.FirstOrDefault(p=>p.SecWebSocketKey.Equals(arg.SecWebSocketKey))); SessionHelper.SetCach("websockect", Listws); } break; } } }
4,前端代码的
var ws; var $msg = $("#msged"); var $jdt = $("#jindut"); $(function() { connec(); }); function connec() { //初始化websocket链接 ws = new WebSocket("ws://" + window.location.hostname + ":" + window.location.port + "/api/MessageSend"); ws.onopen = function () { $msg.html("成功连接服务器"); send(); } ws.onmessage = function (msg) { var md = $.parseJSON(msg.data); $msg.html(md.mess); $jdt.css("width", md.jdt + "%"); $jdt.attr("aria-valuenow", md.jdt); } ws.onerror = function (err) { $msg.html(err); } ws.onclose = function () { $msg.html("连接已经关闭"); } } //发送消息到后台 function send() { // alert(ws.readyState); if (ws.readyState === WebSocket.OPEN) { ws.send('@SessionHelper.GetSession(MeSession.UserManageID)'); } else { $msg.html("链接已经关闭"); } }
相关文章推荐
- Asp.Net MVC3 简单入门第一季(五) 通过Asp.Net MVC的区域功能实现将多个MVC项目部署到一个站点
- 通过扩展改善ASP.NET MVC的验证机制[实现篇]
- asp.net mvc通过预处理实现数据过滤和数据篡改。
- 在ASP.NET MVC中通过URL路由实现对多语言的支持
- asp.net mvc 通过修改路由规则来实现页面的URL多参数传递
- 通过Asp.Net MVC的区域功能实现将多个MVC项目部署
- Web开发中的缓存技术之三:通过ETag实现缓存处理(ASP.NET MVC版)
- 通过扩展改善ASP.NET MVC的验证机制[实现篇]
- ASP.NET MVC入门---实例演示:通过ContentResult实现主题定制
- [Asp.net Mvc]通过UrlHelper扩展实现js,css修改后重新加载
- MVC使用ASP.NET Identity 2.0实现用户身份安全相关功能,比如通过短信或邮件发送安全码,账户锁定等
- Asp.net mvc实现通过下拉框选择页码后自动跳页
- ASP.NET MVC 通过ActionFilter 实现AOP设计 示例
- YbSoftwareFactory 代码生成插件【十】:ASP.NET WebApi MVC下审计、缓存和导出功能的实现
- 通过Asp.Net MVC的区域功能实现将多个MVC项目部署到一个站点
- 转:在ASP.NET MVC中通过URL路由实现对多语言的支持
- 在ASP.NET MVC中通过URL路由实现对多语言的支持
- Asp.net MVC防止图片盗链的实现方法,通过自定义RouteHandler来操作
- YbSoftwareFactory 代码生成插件【十一】:ASP.NET WebApi MVC下组织机构管理和菜单权限管理的实现
- AWS S3 API实现文件上传下载(ASP.NET MVC)