首页 新闻 会员 周边

SignalR---Hub类中属性获取cookie问题

0
悬赏园豆:100 [已解决问题] 解决于 2018-07-27 11:15

[md]问个C#问题,谢谢大家:
# 关键代码:
类中UserName属性
```
private string UserName
{
        // 注意:实测发现,对于每一个连接,一旦第一次访问了给了cookie["USERNAME"],后面不会再次得到新的,这正是问题
        get
        {
                var userName = Context.RequestCookies["USERNAME"];
                return userName == null ? "" : HttpUtility.UrlDecode(userName.Value);
        }
}
```
# 描述:
在A方法中使用了UserName,而A方法由客户端js发起请求,但在发起请求前我改了cookie["USERNAME"],那么此时按照属性即方法,应该会再调用一次get,然后获取修改后的cookie["USERNAME"],然而实测发现还是上次的cookie,并没有再次去get{}重新获取cookie

# 举例:
第一次访问GroupChat.html,此时js自动生成了默认用户名(默认-23),
并将其cookie["USERNAME"]="默认-23",此时传给服务端,实测此时正常,用户名确实为"默认-23"。
然后我再手动更改cookie["USERNAME"]为“张三”,再次发送消息,然而调试发现虽然改变了浏览器的cookie["USERNAME"],但服务端发送者用户名UserName依然为"默认-23"

# 本人猜测:
因为websocket不会自动将客户端cookie发给服务端,那么只有在第一次建立会话,get访问时取到cookie,并且Context.RequestCookies也是在第一次赋值后就会一直保留值,才能导致后面ws通信,全部RequestCookies["USERNAME"]还是为第一次请求时cookie。

这么说Hub中的Context与一般ashx,aspx中的Context不一样,不会因为每一次的请求而重新生成Context
# 源码:
其中的SignalRGroupChatDemo
链接: https://pan.baidu.com/s/18NaXyo9ofsu90Iu9JORfyw 密码: cmbd[/md]

yiyungent的主页 yiyungent | 初学一级 | 园豆:112
提问于:2018-07-26 11:11

我的猜测也有问题,如果不重新生成Context,那么这两个干嘛?
Context.QueryString[""]
Context.Request.QueryString[""]
PS:话说Markdown怎么无效

lifnew 5年前
< >
分享
最佳答案
0

ws建立完成后,走的就不是http协议了。自然就没有cookie啦。如达到cookie的效果,可以使用connectionid在服务器进行数据的存储,类似session机制,每一个客户端每个链接的conectionid都是唯一可识别的。

收获园豆:90
czd890 | 专家六级 |园豆:14412 | 2018-07-26 13:13

首先谢谢你,这么说果然ws建立时创建了Context,这个Context只要浏览器地址栏没有重新enter发起请求(没有重新建立ws),那么也就不会新实例化一个 Context,这个Context将在通信中一直保存供使用,对吗?

yiyungent | 园豆:112 (初学一级) | 2018-07-27 01:24

@lifnew: 可以这么说。ws建联之后,服务器就一直有这个链接的相关数据。断开才会销毁。就好比一次请求过程中,你总是能拿到req,res。一个意思。普通请求生命100ms,ws只要不关就一直或者。所谓长连接嘛

czd890 | 园豆:14412 (专家六级) | 2018-07-27 13:40
其他回答(1)
0

试试

 var userName = HttpContext.Current.Request.Cookies["USERNAME"];
收获园豆:10
dudu | 园豆:30994 (高人七级) | 2018-07-26 15:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册