c# 在 websocket 中访问 session

今天的项目需要用到websocket,但是中websocket中无法直接访问session,一访问session就出错,断开连接。

找了老半天百度也没有相关c#的介绍和方法,没办法,找不到现成的代码,只能自己动手了,

websocket握手时是一个完整的http协议的,发现里面有发送cookie:ASP.NET_SessionId,好了,废话少说,上测试

新建一个WebApi控制器

 1     public class WebApiTestController : ApiController
 2     {
 3         public HttpResponseMessage Get()
 4         {
 5             if (HttpContext.Current.IsWebSocketRequest)
 6             {
 7                 var user = (SysUser.UserInfoClass)HttpContext.Current.Session["user"];//此外是用户session,调试发现获取成功14             }
15             return new HttpResponseMessage(HttpStatusCode.SwitchingProtocols);
16         }
17

客户端js代码

1 <script type="text/javascript">
2     var ws = new WebSocket("ws://" + window.location.hostname + ":" + window.location.port + "/api/WebApiTest/");
3 </script>

验证成功,下面完善整个代码:

客户端js:

 1 <!DOCTYPE html>
 2 
 3 <html>
 4 <head>
 5     <meta name="viewport" content="width=device-width" />
 6     <title>WebSocket</title>
 7     <script type="text/javascript" src="~/scripts/jquery.js"></script>
 8 </head>
 9 <body>
10     <fieldset>
11         <input type="button" value="Connect" id="btnConnect" />
12         <input type="button" value="DisConnect" id="btnDisConnect" />
13         <hr />
14         <input type="text" id="txtInput" />
15         <input type="button" value="Send" id="btnSend" />
16         <br />
17         <span id="messageSpan" style="color:red;"></span>
18     </fieldset>  
19 </body>
20 </html>
21 <script type="text/javascript">
22     var ws;
23     $("#btnConnect").click(function () {
24         $("#messageSpan").text("Connection...");
25         ws = new WebSocket("ws://" + window.location.hostname + ":" + window.location.port + "/api/WebApiTest/");
26         ws.onopen = function () {
27             $("#messageSpan").text("Connected!");
28         };
29         ws.onmessage = function (result) {
30             $("#messageSpan").text(result.data);
31         };
32         ws.onerror = function (error) {
33             $("#messageSpan").text(error.data);
34         };
35         ws.onclose = function () {
36             $("#messageSpan").text("Disconnected!");
37         };
38     });
39     $("#btnSend").click(function () {
40         ws.protocol
41         if (ws.readyState == WebSocket.OPEN) {
42             ws.send($("#txtInput").val());
43         }
44         else {
45             $("messageSpan").text("Connection is Closed!");
46         }
47     });
48     $("#btnDisconnect").click(function () {
49         ws.close();
50     });
51 </script> 

服务器端(mvc.net)

 1     public class WebApiTestController : ApiController
 2     {
 3         public HttpResponseMessage Get()
 4         {
 5             if (HttpContext.Current.IsWebSocketRequest)
 6             {
 7                 var user = (Api_System.JsonClass.SysUser.UserInfoClass)HttpContext.Current.Session["user"];
 8                 var ooo = new Func<AspNetWebSocketContext, Task>((x) => ProcessWSChat(x, user));                
 9                 HttpContext.Current.AcceptWebSocketRequest(ooo);
10             }
11             return new HttpResponseMessage(HttpStatusCode.SwitchingProtocols);
12         }
13 
14         private async Task ProcessWSChat(AspNetWebSocketContext arg, SysUser.UserInfoClass user)
15         {
16             WebSocket socket = arg.WebSocket;
17             while (true)
18             {
19                 ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[1024]);
20                 WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, CancellationToken.None);
21                 if (socket.State == WebSocketState.Open)
22                 {
23                     //客户端发送来的信息
24                     string message = Encoding.UTF8.GetString(buffer.Array, 0, result.Count);
25                     string returnMessage = " You send :" + message + ". and the user is [" + user.UserName + "] at " + DateTime.Now.ToLongTimeString();
26                     buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(returnMessage));
27                     await socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
28                 }
29                 else
30                 {
31                     break;
32                 }
33             }
34         }
35     }

 

转载于:https://www.cnblogs.com/phoenix1630/p/8309483.html

### 回答1: WebSocketsession是指在客户端和服务器之间建立的持久化连接。当客户端与服务器建立WebSocket连接时,服务器会为每个连接创建一个session对象,用于跟踪该连接的状态和信息。通过session对象,服务器可以向客户端发送消息,也可以接收客户端发送的消息。在WebSocketsession对象是一个重要的概念,它可以帮助开发者实现实时通信和数据交换。 ### 回答2: WebSocket是一种用于建立客户端和服务器之间双向通信的协议。在WebSocketsession是一个非常重要的概念,用于表示在服务器和客户端之间建立的连接。 在WebSocket,客户端向服务器发起WebSocket请求,服务器收到请求后会创建一个WebSocket对象,然后将该对象的引用存储到一个会话(session。这个会话在整个WebSocket会话期间都存在,并且可以用来传递WebSocket数据。 在基于Java的WebSocket应用程序session是一个javax.websocket.Session对象,可以用来跟踪WebSocket会话的状态和处理消息。每个WebSocket会话都有一个唯一的session ID,这个ID可以用来识别不同的WebSocket会话。 session对象保存了很多有用的信息,例如WebSocket连接的URI、协议版本、客户端IP地址、WebSocket连接状态等。开发者可以使用session对象来发送消息、接收消息、关闭WebSocket连接以及处理WebSocket事件(例如连接打开、连接关闭、错误发生等)。 除了上述信息以外,session对象还包含了一个用于存储自定义属性的map。开发者可以使用这个map来存储WebSocket会话的任何自定义数据,例如用户信息、游戏状态等。这些自定义属性在处理WebSocket事件时非常有用,可以帮助开发者更好地管理WebSocket会话。 总之,sessionWebSocket的核心概念之一,用于管理WebSocket会话的状态和数据。开发者应该熟练掌握WebSocketsession,并善于利用session来实现WebSocket应用程序的各种需求。 ### 回答3: WebSocket 是一个基于 TCP 协议的网络协议,它使客户端和服务器之间的双向通信变得更加简单。在 WebSocket session 是一个非常重要的概念,用于表示客户端和服务器之间的连接状态。 在 WebSocket ,每个客户端都会创建一个 WebSocket 实例,该实例与服务器建立连接。当客户端与服务器建立连接后,服务器会创建一个 session 对象,该对象用于表示客户端和服务器之间的连接状态。Session 对象包含了与该连接相关的一些信息,例如连接 ID、连接状态、是否关闭等。 在客户端与服务器之间进行数据交互时,数据首先会发往服务器。服务器收到数据后,会根据 session 对象来确定该数据应该分发给哪个客户端。由于 WebSocket 可以实现双向通信,因此服务器也可以主动向客户端发送数据,同时需要使用 session 对象来表示要发送数据的客户端。 Websocket session 具有很多重要的功能。首先,它使得服务器能够轻松地识别每个与之建立连接的客户端。其次,由于 WebSocket 可以在客户端和服务器之间实现双向通信,因此 session 对象也可以用于实现服务器主动向客户端推送数据的功能。最后,session 对象还可以用于维护客户端和服务器之间的连接状态,例如检测连接是否丢失、重连等。 总之,WebSocket session 是非常重要的组成部分,对于实现客户端和服务器之间的双向通信具有重要的作用。通过 session 对象的使用,可以实现服务器主动推送数据的功能,并且保证连接状态的稳定和可靠。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值