如何保留 SignalR 连接 ID

2024-03-12

我正在尝试构建一个聊天应用程序,其中用户 ID 由其自动生成的 signalR 连接 ID 表示。页面刷新时,实例化新连接时连接 ID 会发生变化。有没有办法持久保存用户连接 ID 的状态,直到浏览器会话结束(即直到他结束客户端上的会话)。

有任何指南或文档吗?这确实会有帮助。

我是信号器新手。所以想通过谷歌来了解很多东西。从这个网址我得到了一个类似的片段http://kevgriffin.com/maintaining-signalr-connectionids-across-page-instances/ http://kevgriffin.com/maintaining-signalr-connectionids-across-page-instances/

他们说这是可能的。问题是,如果我们引用页面,信号器通常会创建一个新的连接 ID。我想阻止这种情况,但是如何......

这段代码片段。

public class MyConnectionFactory : IConnectionIdFactory
    {
        public string CreateConnectionId(IRequest request)
        {
            if (request.Cookies["srconnectionid"] != null)
            {
                return request.Cookies["srconnectionid"];
            }

            return Guid.NewGuid().ToString();
        }
    }

$.connection.hub.start().done(function () {
        alert("Connected!");
        var myClientId = $.connection.hub.id;
        setCookie("srconnectionid", myClientId);
    });

    function setCookie(cName, value, exdays) {
        var exdate = new Date();
        exdate.setDate(exdate.getDate() + exdays);
        var c_value = escape(value) + ((exdays == null) ? "" : "; expires=" + exdate.toUTCString());
        document.cookie = cName + "=" + c_value;
    }

我的疑问是它适用于所有信号器版本吗?如果不是,那么如何在新版本中处理它,特别是在页面刷新时不生成新的连接 ID。寻找建议。

如果我们使用持久连接类而不是集线器,那么会发生什么......在这种情况下,如果我们在客户端刷新页面,连接 ID 将持续存在?请指导。 谢谢


SignalR 允许您通过用户的方式向用户发送消息IPrincipal.Identity.Name。只需使用Clients.User(userName)代替Clients.Client(connectionId).

如果您出于某种原因无法使用用户的地址来称呼他们IPrincipal.Identity.Name你可以创建自己的用户ID提供者 http://www.asp.net/signalr/overview/guide-to-the-api/mapping-users-to-connections#IUserIdProvider。这是替代品IConnectionIdFactorySignalR >= 1.0.0 中不再存在。

相当于IUserIdProvider看起来像这样:

public class MyConnectionFactory : IUserIdProvider
{
    public string GetUserId(IRequest request)
    {
        if (request.Cookies["srconnectionid"] != null)
        {
            return request.Cookies["srconnectionid"];
        }

        return Guid.NewGuid().ToString();
    }
}

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var idProvider = new MyConnectionFactory();
        GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider), () => idProvider);

        app.MapSignalR();
    }
}

public class MyHub : Hub
{
    public Task Send(string userName, string message)
    {
        return Clients.User(userName).receive(message);
    }
}

考虑到这一点,欺骗用户真的是微不足道的MyConnectionFactory。您可以通过使用使其更安全HMAC https://en.wikipedia.org/wiki/Hash-based_message_authentication_code.

理想情况下,您只需使用默认 IUserIdProvider https://github.com/SignalR/SignalR/blob/2.1.2/src/Microsoft.AspNet.SignalR.Core/Infrastructure/PrincipalUserIdProvider.cs从中检索用户 IDIRequest.User.Identity.Name.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何保留 SignalR 连接 ID 的相关文章

  • .Net 2.0 ServiceController.GetServices()

    我有一个启用了 Windows 身份验证的网站 从网站的页面中 用户可以启动一项对数据库执行某些操作的服务 启动该服务对我来说效果很好 因为我是服务器上的本地管理员 但我刚刚让一个用户测试了它 但他们无法启动该服务 我的问题是 有谁知道一种
  • 有没有一种简单的方法来生成不重复的字符串?

    我知道我可以使用 GUID 生成唯一的字符串 但它太长了 现在我只需要在网站内生成不重复的字符串 我该怎么办 谢谢 例如 在网站上http mathurl com http mathurl com 可以生成一个永久的URL 比如http m
  • 在正常运行时间较长后,服务器端 SignalR 连接失败

    我在 StackOverflow 上搜索了许多与 SignalR 连接相关的其他问题 但似乎都不适用于我的具体情况 我有一个使用 SignalR 集线器的应用程序 客户端可以使用两种方法连接到集线器 通过使用底层客户端连接到集线器的 NET
  • 如何配置 IIS 以接受 POST 请求?

    我知道默认情况下 IIS 不接受发布请求 如何更改此设置 有人可以引导我改变这个 一步一步 吗 如果您使用的是 IIS 6 及更低版本 在 IIS 管理屏幕中右键单击您的网站或虚拟目录 去Properties然后去Home Director
  • 在 ASP.NET 3.5 中使用 ASMX 文件的 WS-Security

    基本上 我需要设置 ASMX 文件 以便当我在浏览器中将其拉出以显示 WebMethod 规范时 Soap 标头符合以下格式
  • 根据所选单选按钮启用文本框

    我有一个单选按钮列表 其中列出了不同的业务类别 最后一个选项是Other类别 当用户选择Other类别 我希望能够启用一个文本框 用户可以输入更多信息来解释Other选择 目前 我正在尝试 If rblCategory SelectedIn
  • If else 在 Web 网格列中

    如何在 webgrid 列中添加条件 if else grid GetHtml tableStyle table table bordered columns grid Columns grid Column RealName Name g
  • idleTimeout 和 ShutdownTimeout 之间的区别

    我正在尝试放宽网站的会话过期策略 以便用户可以指定会话超时间隔 我需要弄清楚应该指定哪些网站相关设置 以免过多限制用户 例如 可能需要 1 天的间隔 我将使用门票来实现这一点 现在 我知道我可以在网站的 web config 文件中指定id
  • 多选复选框下拉

    我正在使用多选复选框下拉菜单 请看例子jsfiddle http jsfiddle net manthan11 qqhczbvs 6 function lstStates multiselect 选择州后 它会显示 TEXT 值并用逗号连接
  • Entity Framework Core 中的两个外键

    我在使用 Entity Framework Core 创建数据库时使用代码优先方法 我想创建两个指向同一个表的外键 我的示例显示用户表将保存用户 ID 消息表将保存接收者 ID 和发送者 ID 这意味着两个值必须指向同一个表 用户代码 pu
  • 使用主题 css 文件需要页面上的标头控件。 (例如 )

    我正在开发 asp net 网络项目 当我运行该项目时 它工作正常 但在服务器中 我收到以下错误 如何解决这个问题呢 Using themed css files requires a header control on the page
  • requestValidationMode 2.0 和 4.0 有什么区别

    这是 MSDN 的定义 4 0 默认值 HttpRequest 对象在内部设置一个标志 指示每当访问任何 HTTP 请求数据时都应触发请求验证 这保证了在请求期间访问 cookie 和 URL 等数据之前触发请求验证 配置文件中的页面元素
  • 为什么在 C# 中使用 String.Concat()?

    我想知道这个问题有一段时间了 为什么使用String Concat 而不是使用 操作员 我明白了String Format因为它是一个空洞使用 运算符并使您的代码看起来更好 例如 string one bob string two jim
  • 使用 ELMAH 记录 WCF 服务的异常

    我们正在使用优秀的ELMAH http code google com p elmah处理 ASP NET 3 5 Web 应用程序中未处理的异常 这对于除使用 REST 功能使用的 WCF 服务之外的所有站点都非常有效 当操作方法中发生应
  • 如何在 ASP.NET MVC 中使用 Html.Action() 将参数传递给 Action?

    我一直在使用Html Action ActionName ControllerName 跨控制器调用子操作 而无需在 Views Shared 中拥有视图 这对于显示会话或 cookie 信息等内容非常有效 我不只是访问 cookie 而是
  • 选择 asp.net CheckBoxList 中的所有项目

    ASP NET 和 C 我想要一个带有 全选 项目的复选框列表 当这个特定项目是 已选择 所有其他都将被选择 也 当选择被删除时 这个项目 也将来自所有人 其他物品 选中 取消选中 任何其他项目只会有一个 对特定项目的影响 无论选择状态如何
  • 存储在 Session 中的变量在整个页面生命周期中是否反序列化一次或多次?

    我想以类似的方式包装会话变量在 CodeProject 上讨论 http www codeproject com KB aspnet wrapthosesessionvariables aspx msg 2315287 public sta
  • 管理调试和发布连接字符串

    在 NET SQLServer 应用程序中管理调试和发布连接字符串的好方法是什么 我有两个 SQL Server 一个是生产服务器 一个是构建 调试服务器 我需要一种在部署 ASP NET 应用程序时在这两个服务器之间进行切换的方法 目前
  • 如何排列表格中的项目 - MVC3 视图 (Index.cshtml)

    我想使用 ASP NET MVC3 显示特定类型食品样本中存在的不同类型维生素的含量 如何在我的视图 Index cshtml 中显示它 an example 这些是我的代码 table tr th th foreach var m in
  • HTML 属性 bgcolor 已弃用:用什么代替?

    VStudio ASP NET 给出以下消息 Attribute bgcolor is considered outdated A newer construct is recommended 推荐的结构是什么 bgcolor是在一个 td

随机推荐

  • 如何计算两个 Keras 张量的平方差?

    我有一个 KerasModel它计算两个张量 r1 and r2相同形状的 我想让模型计算 r1 r2 2 我可以将这些张量的总和与keras layers add r1 r2 我可以带产品keras layers multiply r1
  • 已弃用:iOS9 中的“sendAsynchronousRequest:queue:completionHandler:”

    我有自己的类来进行 http 调用 但现在在 iOS9 中此方法已被弃用 NSURLConnetion sendAsynchronousRequest queue completionHandler 我正在尝试测试新的 NSURLSessi
  • 为什么我的 XML 验证根据其架构失败?

    我需要根据架构验证 XML 文件 XML 文件是在代码中生成的 在保存之前 我需要验证它是否正确 我已将问题简化为最简单的要素 但遇到了问题 XML
  • 从 C# 传递 SSIS 参数

    我有一个 SSIS 包 其中设置了一些 Project params 如何通过 C 将这些参数的值传递到 SSIS 包 我正在尝试以下操作 const string pkgLocation export dtsx var app new A
  • 运行鼻子测试并将警告作为错误?

    跑步时nosetests从命令行 如何指定 不可忽略 警告应被视为错误 默认情况下 会打印警告 但不计为失败 snip service accounts database py 151 SADeprecationWarning Use se
  • 透明win32窗口和文本

    我正在尝试制作全屏透明无边框窗口 其上的文本完美显示 文本背景应该是透明的 但实际的字体当然不是 问题是 当我不执行 SetWindowRgn 时 我只能看到 TextOut 显示 我不知道我做错了什么 BOOL InitInstance
  • “动态”CSS id 名称?如何将它们添加到 CSS 文件中?

    我在应用程序中有动态生成的 DIV id 末尾有一个 ID 例如 div div div 等等 如何在 CSS 文件中写入该 id 以便对其应用样式 进一步建议您应该使用类来实现此功能 并且您should you can 而是使用 attr
  • 交换卡片时无法更新片段文本

    我正在开发卡片刷卡和卡片翻转功能 并且我正在使用 ViewPager 和片段 我的问题是 当我从左到右或从右到左滑动卡片时 我无法更新片段内的 TextView 但是当我翻转卡片时 它会更新 UI 我尝试了互联网上可用的所有解决方案 但没有
  • 正在关闭 Popover,[UIPopoverController dealloc] 在弹出窗口仍然可见时达到

    我有一个 UIPopoverController 存储在我的视图控制器的一个强属性中 当用户在弹出窗口可见时旋转 iPad 时 我会关闭弹出窗口并将属性设置为 nil if self popover nil self popover dis
  • ASP.Net MVC 中的 Google Checkout

    我有一个相当简单的 ASP Net 站点 它使用 google checkout 我有一个图像按钮 其 PostBackUrl 设置为传递隐藏字段值的 Google 地址 效果很好 我已经将此应用程序移至 MVC 但我不知道如何处理这个问题
  • Swift 可选转义闭包

    编译错误Closure use of non escaping parameter completion may allow it to escape 这是有道理的 因为它将在函数返回后被调用 func sync completion gt
  • 使用 TFS 命令行 tf.exe 如何将存储库复制到我选择的文件夹位置?

    我已开始在我的 MSVC 2015 C 项目中使用 TFVC 我习惯了像 git svn 这样的命令行存储库 我可以简单地进行签出 克隆等 并将文件复制到我喜欢的任何文件夹中 因此 我已通过 MSVS2015 GUI 将工作区检出到映射位置
  • custom_command ECHO 带有特殊字符

    我正在尝试使用 CMake 添加 custom command 并调用 COMMAND echo gt file txt 只要我把 放进去 配置文件就会生成 但构建失败 我也尝试过 echo 但似乎不起作用 add custom comma
  • 移动相机位置以适应 LatLngBounds 的标记高度

    我想将相机移动到适合的位置LatLngBounds关于标记高度 到目前为止 我可以使用以下代码来安装标记的锚点 LatLngBounds Builder builder new LatLngBounds Builder for Marker
  • AngularJS 1.2.0-rc.2 与 1.2.0 元素绑定

    我最近将 AngularJS 框架从 1 2 0 rc 2 升级到 1 2 0 版本 并遇到了一个奇怪的问题 我还没有找到解决方法 我之前解决的问题是强制输入字段在 on blur 事件而不是 on change 事件上触发 我最初使用的指
  • 指导我使用 phpleague 库实现 Oauth2 PHP 服务器

    我在用Slim Framework With Eloquent ORM https packagist org packages illuminate database 尝试实施https github com thephpleague o
  • Intellij IDEA 编译所有模块,即使我只要求 1 个

    我的项目中有几个具有复杂依赖结构的模块 当我想编译并运行 1 个模块的单元测试时 我希望 IDEA 忽略不相关模块中的任何编译错误 我怎样才能做到这一点 目前 即使我说 编译模块 1 IDEA 也会编译所有内容 我不想为此设置几个不同的项目
  • 如何控制提交网格作业时使用的 Perl 版本?

    我正在与 SGE Sun Grid Engine 合作将作业提交到网格 我也用perlbrew管理我安装的 Perl 版本 我写了一些短文sh我用来运行需要特定 Perl 版本 5 12 2 的 perl 脚本的脚本 如下所示 bin ba
  • 使用 Datastax Cassandra 本机 Java 客户端管理不同一致性级别的最佳实践

    使用 CQL3 Cassandra 一致性级别现在设置在会话级别 本机 Java 客户端的 Datastax 文档指出 会话实例是线程安全的 通常每个应用程序只需要一个实例 但我很难理解单个 Session 实例如何处理多个一致性级别 例如
  • 如何保留 SignalR 连接 ID

    我正在尝试构建一个聊天应用程序 其中用户 ID 由其自动生成的 signalR 连接 ID 表示 页面刷新时 实例化新连接时连接 ID 会发生变化 有没有办法持久保存用户连接 ID 的状态 直到浏览器会话结束 即直到他结束客户端上的会话 有