Asp.net core中的websocket

简介:




Websockethtml5后的产物,对于asp.net core中也得到了支持,首先在NuGet中添加Microsoft.AspNetCore.WebSockets的引用(现在是1.0.1版本,201737日发布的)。

首先在Configure中添加中间件

1
2
//添加websocket中间件
app.UseWebSockets();

接下来就要定义自己处理websocket的中间件了,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using  Microsoft.AspNetCore.Http;
using  System;
using  System.Net.WebSockets;
using  System.Threading;
using  System.Threading.Tasks;
  
namespace  Asp.NetCore_WebPage.Middleware
{
     /// <summary>
     /// websocket中间件,客户端发送的信息显示在控件台上,客户端会定时收到服务端推送的时间
     /// </summary>
     public  class  WebSocketNotifyMiddleware
     {
         /// <summary>
         /// 管道代理对象
         /// </summary>
         private  readonly  RequestDelegate _next;
         /// <summary>
         /// 
         /// </summary>
         /// <param name="next"></param>
         public  WebSocketNotifyMiddleware(RequestDelegate next)
         {
             _next = next;
         }
         /// <summary>
         /// 中间件调用
         /// </summary>
         /// <param name="context"></param>
         /// <returns></returns>
         public  Task Invoke(HttpContext context)
         {
             //判断是否为websocket请求
             if  (context.WebSockets.IsWebSocketRequest)
             {
                 //接收客户端
                 var  webSocket = context.WebSockets.AcceptWebSocketAsync().Result;
                 //启用一个线程处理接收客户端数据
                 new  Thread(Accept).Start(webSocket);
                 while  (webSocket.State == WebSocketState.Open)
                 {
                     webSocket.SendAsync( new  ArraySegment< byte >(System.Text.Encoding.UTF8.GetBytes($ "{DateTime.Now}" )), System.Net.WebSockets.WebSocketMessageType.Text,  true , CancellationToken.None);
                     Thread.Sleep(1000);
                 }
             }
             return  this ._next(context);
  
         }
         /// <summary>
         /// 接收客户端数据方法,这里可以根据自己的需求切换功能代码
         /// </summary>
         /// <param name="obj"></param>
         void  Accept( object  obj)
         {
             var  webSocket = obj  as  WebSocket;
             while  ( true )
             {
                 var  acceptArr =  new  byte [1024];
  
                 var  result = webSocket.ReceiveAsync( new  ArraySegment< byte >(acceptArr), CancellationToken.None).Result;
  
                 var  acceptStr = System.Text.Encoding.UTF8.GetString(acceptArr).Trim( char .MinValue);
                 Console.WriteLine( "收到信息:"  + acceptStr);
             }
  
         }
     }
}

添加中间件扩展

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using  Microsoft.AspNetCore.Builder;
using  Microsoft.AspNetCore.Http;
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Net.WebSockets;
using  System.Threading;
using  System.Threading.Tasks;
  
namespace  Asp.NetCore_WebPage.Middleware
{
     /// <summary>
     /// websocket通知中间件扩展
     /// </summary>
     public  static  class  WebSocketNotifyMiddlewareExtensions
     {
         /// <summary>
         /// 使用websocket通知
         /// </summary>
         /// <param name="builder"></param>
         /// <returns></returns>
         public  static  IApplicationBuilder UseWebSocketNotify(
           this  IApplicationBuilder builder)
         {
             return  builder.UseMiddleware<WebSocketNotifyMiddleware>();
         }
     }
}

这样,就可以在Startup.cs中的Configure中添加自己创建的中间件了,代码如下:

1
2
3
//添加websocket中间件
  app.UseWebSockets();
  app.UseWebSocketNotify();


到此服务端创建完成,接下来看客户端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<div>
     当前在数据:<div id= "message" ></div>
     <div id= "output" ></div>
     <input class= "form-control"  type= "text"  id= "sendtxt"  value= "测试"  />
     <input type= "button"  onclick= "start()"  value= "开始"  />
     <input type= "button"  onclick= "send()"  value= "发送"  />
</div>
@section scripts{
<script>
var  socket;
      var  uri =  "ws://localhost:5000/ws" ;
//初始化连接
function  doConnect(open, accept, close, error) {
console.log( "doConnect" )
//创建websocket,并定义事件回调
     socket =  new  WebSocket(uri);
     socket.onopen =  function  (e) { open();};
     socket.onclose =  function  (e) { close(); };
     socket.onmessage =  function  (e) {
         accept(e.data);
     };
     socket.onerror =  function  (e) { error(e.data); };
}
//发送信息
function  doSend(message) {
     console.log( "doSend" )
     socket.send(message);
}
//关闭socket
function  doClose() {
     console.log( "doClose" )
     socket.close();
}        
//打开连接回调
         function  open() {
             console.log( "open" )
             document.getElementById( "message" ).innerText =  "连接打开" ;
         }
         //接收数据回调
         function  accept(result) {
             console.log( "accept" )
             document.getElementById( "output" ).innerText=result;
         }
         //关闭连接回调
         function  close() {
             console.log( "close" )
             document.getElementById( "message" ).innerText= "连接关闭" ;
         } //错误回调
         function  error(result) {
             console.log( "error" )
             alert( "错误:" +result);
         }
         //开始方法
         function  start() {
             console.log( "start" )
             doConnect(open, accept, close, error);         
         }
         function  send()
         {
             console.log( "send" )
             doSend(document.getElementById( "sendtxt" ).value); 
         }
     </script>
}


这里只是一个基本的例子,可以根据自己的业务来实现不同的功能。

















本文转自桂素伟51CTO博客,原文链接:http://blog.51cto.com/axzxs/1909795 ,如需转载请自行联系原作者



相关文章
|
10天前
|
消息中间件 前端开发 小程序
一个基于.NET Core构建的简单、跨平台、模块化的商城系统
今天大姚给大家分享一个基于.NET Core构建的简单、跨平台、模块化、完全开源免费(MIT License)的商城系统:Module Shop。
|
10天前
|
算法 C# 数据库
【干货】一份10万字免费的C#/.NET/.NET Core面试宝典
C#/.NET/.NET Core相关技术常见面试题汇总,不仅仅为了面试而学习,更多的是查漏补缺、扩充知识面和大家共同学习进步。该知识库主要由自己平时学习实践总结、网上优秀文章资料收集(这一部分会标注来源)和社区小伙伴提供三部分组成。该份基础面试宝典完全免费,发布两年来收获了广大.NET小伙伴的好评,我会持续更新和改进,欢迎关注我的公众号【追逐时光者】第一时间获取最新更新的面试题内容。
|
10天前
|
数据可视化 网络协议 C#
C#/.NET/.NET Core优秀项目和框架2024年3月简报
公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯🔔)。
|
10天前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
27 0
|
10天前
|
Linux API iOS开发
.net core 优势
.NET Core 的优势:跨平台兼容(Windows, macOS, Linux)及容器支持,高性能,支持并行版本控制,丰富的新增API,以及开源。
30 4
|
10天前
|
开发框架 人工智能 .NET
C#/.NET/.NET Core拾遗补漏合集(持续更新)
在这个快速发展的技术世界中,时常会有一些重要的知识点、信息或细节被忽略或遗漏。《C#/.NET/.NET Core拾遗补漏》专栏我们将探讨一些可能被忽略或遗漏的重要知识点、信息或细节,以帮助大家更全面地了解这些技术栈的特性和发展方向。
|
10天前
|
开发框架 中间件 .NET
C# .NET面试系列七:ASP.NET Core
## 第一部分:ASP.NET Core #### 1. 如何在 controller 中注入 service? 在.NET中,在ASP.NET Core应用程序中的Controller中注入服务通常使用<u>依赖注入(Dependency Injection)</u>来实现。以下是一些步骤,说明如何在Controller中注入服务: 1、创建服务 首先,确保你已经在应用程序中注册了服务。这通常在Startup.cs文件的ConfigureServices方法中完成。例如: ```c# services.AddScoped<IMyService, MyService>(); //
106 0
|
7月前
|
开发框架 前端开发 .NET
ASP.NET Core 核心特性学习笔记「下」
ASP.NET Core 核心特性学习笔记「下」
|
7月前
|
开发框架 前端开发 中间件
ASP.NET Core 核心特性学习笔记「上」
ASP.NET Core 核心特性学习笔记「上」
|
SQL 机器学习/深度学习 Cloud Native
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 更新和迁移)--学习笔记
- 状态 - 自动变更检测 - 不查询删除和更新 - 并发
227 0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 更新和迁移)--学习笔记