27

我理解为什么 SignalR 不允许您访问 HttpContext。然而,这对我们来说是相当有问题的。让我解释:

我们的应用程序是一个多租户应用程序,用户在登录时选择环境。这基本上是在 HttpSession 中注册 ConnectionStringName。在我们的 SignalR Hub 中,我们需要访问Disconnect. 但这是不可能的,因为此时我们没有 HttpContext 并且无法确定要写入的环境。

任何人都可以向我们提供如何解决这个问题的建议吗?我们有点卡在这个上。

编辑:如果您的解决方案在负载平衡环境中工作,则加分。

4

5 回答 5

28

这是一个老问题,但我留下我的答案以防万一它对那里的任何人有帮助。

由于您的集线器扩展了Microsoft.AspNet.SignalR.Hub,因此它可以访问HubCallerContext类型的Context属性

这个属性暴露了调用者的很多信息:

  • 连接 ID
  • 标头
  • 请求参数
  • 要求
  • 饼干
  • 用户

在我的解决方案中,我使用存储在Context.User.Identity.Name中的用户名作为我的键/值存储(在我的情况下为Redis)中的键来跟踪用户拥有的所有连接。

您可以覆盖OnConnnectOnDisconnect以维护与用户关联的连接列表。您还可以存储您想要的任何其他内容以及连接 ID(您的用户连接字符串,在您的情况下)。

于 2013-08-29T14:05:33.733 回答
11

嗨有一个类似的问题,因为我需要识别我的应用程序的未经身份验证的访问者,以个性化他们对 SignalR 集线器的请求。

我已经通过访问“HttpContext.Current.Request.AnonymousId”解决了这个问题。AnonymousId 映射到 SQL 数据库中自行实现的会话实体中的临时记录 - 本质上是模拟数据库支持的会话。

如果您希望自定义 AnonymousId 或初始化数据库条目,请在此处提供一些相关文档:http: //msdn.microsoft.com/en-us/library/system.web.httprequest.anonymousid.aspx

此外,您应该能够像这样访问 OnDisconnected() 中的上下文:Context.Request.GetHttpContext()

我希望这有帮助。

于 2013-08-27T14:42:31.600 回答
10

如果您使用的是ASP.NET Core SignalR 3.0(不是ASP.NET SignalR 2.1),那么您可以Context.GetHttpContext()使用HttpContext.

仅供参考,Signalr 3.0 不再具有该Context.Request对象。Request 上下文可以通过访问IHttpContextFeature in Context.Features[]. 我使用了以下内容:

IHttpContextFeature  hcf           = (IHttpContextFeature)this.Context.Features[typeof(IHttpContextFeature)];
HttpContext          hc            = hcf.HttpContext;
string               myCookieValue = hc.Request.Cookies["Value"];

这可能会使用一些空检查或者可能更清洁,但希望这可以节省一些时间。

于 2019-10-16T21:38:06.597 回答
0

You can use something like a Dictionary to keep track of the ConnectionId of the user when they connect. Also using SQL Server to store the Session State may also help : http://support.microsoft.com/kb/317604

SignalR does give you access to User.Identity.Name which you can use to track when the disoconnect() is fired.

于 2012-09-18T08:34:50.110 回答
0

您需要您的解决方案在负载平衡的环境中工作这一事实强制您需要将连接字符串存储在与 Session 不同的东西中。键值存储(如何实现并不重要),其中键是 ConnectionId(断开连接时唯一可用的信息),值是连接字符串。如果需要,您可以继续在任何其他地方使用 Session,但我认为您应该将整个应用程序移动到从那里写入和读取,至少对于该信息。

于 2012-09-21T10:35:55.023 回答