Lod*_*ijk 20 asp.net signalr signalr-hub
我理解为什么SignalR不允许你访问HttpContext.但是,这对我们来说是个问题.让我解释:
我们的应用程序是一个多租户应用程序,用户在登录时选择环境.这基本上在HttpSession中注册了ConnectionStringName.在我们的SignalR Hub中,我们需要访问数据库Disconnect.但这是不可能的,因为此时我们没有HttpContext,无法确定要写入的环境.
任何人都可以向我们提出如何解决这个问题的建议吗?我们有点卡在这一点上.
编辑:如果您的解决方案在负载平衡环境中工作,则为奖励积分.
Rac*_* R. 23
这是一个老问题,但我留下我的答案,以防它对那里的任何人都有帮助.
由于您的集线器扩展了Microsoft.AspNet.SignalR.Hub,因此它可以访问HubCallerContext类型的Context属性
此属性公开来自调用者的大量信息:
在我的解决方案中,我使用Context.User.Identity.Name中存储的用户名作为我的键/值存储区中的键(在我的情况下为Redis)来跟踪用户拥有的所有连接.
您可以覆盖OnConnnect和OnDisconnect以维护与用户关联的连接列表.您还可以将任何其他所需内容与连接ID(您的用户连接字符串,在您的情况下)一起存储.
您有一个类似的问题,因为我需要识别我的应用程序的未经过身份验证的访问者,以个性化他们对SignalR中心的请求.
我通过访问"HttpContext.Current.Request.AnonymousId"解决了这个问题.AnonymousId映射到SQL数据库中自实现的Session实体中的临时记录 - 实质上是模拟数据库支持的会话.
这里有一些相关的文档,以防你想自定义AnonymousId或初始化数据库条目:http://msdn.microsoft.com/en-us/library/system.web.httprequest.anonymousid.aspx
此外,您应该能够像这样访问OnDisconnected()中的Context:Context.Request.GetHttpContext().
我希望这有帮助.
小智 8
如果您使用ASP.NET核心SignalR 3.0(不是ASP.NET SignalR 2.1),那么你可以使用Context.GetHttpContext()到获取HttpContext。
仅供参考,Signalr 3.0 不再具有该Context.Request对象。可以通过访问IHttpContextFeature in Context.Features[]. 我使用了以下内容:
IHttpContextFeature hcf = (IHttpContextFeature)this.Context.Features[typeof(IHttpContextFeature)];
HttpContext hc = hcf.HttpContext;
string myCookieValue = hc.Request.Cookies["Value"];
Run Code Online (Sandbox Code Playgroud)
这可能会使用一些空检查或可能更干净,但希望这可以节省一些时间。
您可以使用字典之类的东西来跟踪用户连接时的 ConnectionId。另外使用 SQL Server 存储会话状态也可能有所帮助:http://support.microsoft.com/kb/317604
SignalR 确实允许您访问 User.Identity.Name,您可以使用它来跟踪 disoconnect() 何时被触发。
| 归档时间: |
|
| 查看次数: |
18080 次 |
| 最近记录: |