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

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

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

新建一个WebApi控制器

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

客户端js代码

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

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

客户端js:

 <!DOCTYPE html>

 <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>WebSocket</title>
<script type="text/javascript" src="~/scripts/jquery.js"></script>
</head>
<body>
<fieldset>
<input type="button" value="Connect" id="btnConnect" />
<input type="button" value="DisConnect" id="btnDisConnect" />
<hr />
<input type="text" id="txtInput" />
<input type="button" value="Send" id="btnSend" />
<br />
<span id="messageSpan" style="color:red;"></span>
</fieldset>
</body>
</html>
<script type="text/javascript">
var ws;
$("#btnConnect").click(function () {
$("#messageSpan").text("Connection...");
ws = new WebSocket("ws://" + window.location.hostname + ":" + window.location.port + "/api/WebApiTest/");
ws.onopen = function () {
$("#messageSpan").text("Connected!");
};
ws.onmessage = function (result) {
$("#messageSpan").text(result.data);
};
ws.onerror = function (error) {
$("#messageSpan").text(error.data);
};
ws.onclose = function () {
$("#messageSpan").text("Disconnected!");
};
});
$("#btnSend").click(function () {
ws.protocol
if (ws.readyState == WebSocket.OPEN) {
ws.send($("#txtInput").val());
}
else {
$("messageSpan").text("Connection is Closed!");
}
});
$("#btnDisconnect").click(function () {
ws.close();
});
</script>

服务器端(mvc.net)

     public class WebApiTestController : ApiController
{
public HttpResponseMessage Get()
{
if (HttpContext.Current.IsWebSocketRequest)
{
var user = (Api_System.JsonClass.SysUser.UserInfoClass)HttpContext.Current.Session["user"];
var ooo = new Func<AspNetWebSocketContext, Task>((x) => ProcessWSChat(x, user));
HttpContext.Current.AcceptWebSocketRequest(ooo);
}
return new HttpResponseMessage(HttpStatusCode.SwitchingProtocols);
} private async Task ProcessWSChat(AspNetWebSocketContext arg, SysUser.UserInfoClass user)
{
WebSocket socket = arg.WebSocket;
while (true)
{
ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[]);
WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, CancellationToken.None);
if (socket.State == WebSocketState.Open)
{
//客户端发送来的信息
string message = Encoding.UTF8.GetString(buffer.Array, , result.Count);
string returnMessage = " You send :" + message + ". and the user is [" + user.UserName + "] at " + DateTime.Now.ToLongTimeString();
buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(returnMessage));
await socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
}
else
{
break;
}
}
}
}

c# 在 websocket 中访问 session的更多相关文章

  1. 如何在WebSocket类中访问Session

    我最近正在做一个基于websocket的webQQ,最后代码会开源带github上,所以过程中我就不贴所有的代码啦~就贴问题的关键. 我在WebSocket里发消息的时候需要用到session,因为在 ...

  2. 在一般处理文件中访问Session需要添加IRequiresSessionState(转载)

    原文:http://blog.csdn.net/cdsnaspnet/article/details/5695625s 通常我们经常,通过session判定用户是否登录.还有一些临时的.重要的数据也尝 ...

  3. 在一般处理文件中访问Session需要添加IRequiresSessionState

    在IHttpHandler 使用Session 通常我们经常,通过session判定用户是否登录.还有一些临时的.重要的数据也尝尝存放在Session中. 在页面我们很容易的得到Session的值,但 ...

  4. ASP.NET Global Application_Error事件中访问Session报错 解决

    报错信息:会话状态在此上下文中不可用 protected void Application_Error(object sender, EventArgs e) { //以此判断是否可用Session ...

  5. 会话状态在此上下文中不可用HttpModule中无法访问Session原因

    写了一个自定义HttpModule,但始终访问不了Session,代码如下: public class RouteModule : IHttpModule, System.Web.SessionSta ...

  6. 使用java中的session来记录访问次数

    <%@ page import="java.net.CookieHandler" %><%-- Created by IntelliJ IDEA. User: D ...

  7. Tomcat中的Session小结

    什么是Session 对Tomcat而言,Session是一块在服务器开辟的内存空间,其存储结构为ConcurrentHashMap: Session的目的 Http协议是一种无状态协议,即每次服务端 ...

  8. 在IHttpHandler中获取session

    因为业务要异步通过IHttpHandler获得数据,但还要根据当前登录人员的session过滤,因此要在在IHttpHandler中获取session 方法是HttpHandler容器中如果需要访问S ...

  9. rails中的session

    学rails toturial的时候,第八章一直觉得有点没吃透,后来看了两篇rails关于session和cookies源码分析的文章,cookie原理与实现(rails篇) 和session原理与实 ...

随机推荐

  1. php自动获取上一个月的起始时间

    1.借鉴评论的方法[20170309 edit] function get_month_start_end($timestamp) { !empty($timestamp) OR $timestamp ...

  2. token 和 服务器端auth0-JWT包的使用

    移动客户端和服务器端在用户登录上经常使用的是一个叫做token的认证方法 token是什么? token顾名思义, 令牌, 意思就是说,第一次用户登录验证之后,服务器返回一个token令牌,之后客户端 ...

  3. c# 获取程序目录

    取得控制台应用程序的根目录方法1:Environment.CurrentDirectory 取得或设置当前工作目录的完整限定路径2:AppDomain.CurrentDomain.BaseDirect ...

  4. Azure 订阅和服务限制、配额和约束

    最后更新时间:2016年10月24日 概述 本文档指定一些最常见的 Azure 限制.请注意,本文档目前未涵盖所有 Azure 服务.一段时间后,将展开并更新这些限制以包含多个平台. NOTE: 如果 ...

  5. 3.5星|《刷屏:视频时代的风传法则》:YouTube热门视频回顾与分析

    刷屏:视频时代的疯传法则 作者2010年加入YouTube.本书是作者对YouTube上的热门视频的回顾与分析.第2-9章各讲一个类别的热门视频:恶搞.混音.网络歌曲.广告.现场目击.知识与科技.小众 ...

  6. css根据屏幕大小切换样式

    首先html head之间加入: <meta content="width=device-width, initial-scale=1.0, minimum-scale=1.0, ma ...

  7. Pymyaql操作数据库

    Pymyaql操作数据库 Python3中专门用于操作Mysql数据库的模块. 一. 导入模块 import pymysql 二. 创建连接 conn=pymysql.connect(host=’12 ...

  8. 4、Android-数据存储方案(文件存储/SharedPreferences)

    简介: 任何一个应用程序都需要和数据进行交互 对于软件来说微博.QQ等都需要关系的是数据 没有数据的应用程序是一个没有灵魂的软件 而且还没有实际的用途 可以认为是单机 4.1.持久化技术的简介 数据持 ...

  9. MyBatis(1)-简单入门

    简介 什么是 MyBatis ? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.My ...

  10. Mysql注入攻击与防御(思维导图笔记)