繁体   English   中英

Signalr从集线器外部呼叫特定客户端

Signalr calling specific client from outside the hub

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我知道Chris Fulstow项目log4net.signalr ,如果您要使用非生产日志,因为它记录了所有请求的所有消息,所以这是一个好主意。 我想通过发出请求来区分日志消息,然后将其发送回正确的浏览器。

这是我在追加程序中完成的操作:

 public class SignalRHubAppender:AppenderSkeleton
    {
        protected override void Append(log4net.Core.LoggingEvent loggingEvent)
        {
            if (HttpContext.Current != null)
            {
                var cookie = HttpContext.Current.Request.Cookies["log-id"];
                if (null != cookie)
                {
                    var formattedEvent = RenderLoggingEvent(loggingEvent);
                    var context = GlobalHost.ConnectionManager.GetHubContext<Log4NetHub>();
                    context.Clients[cookie.Value].onLog(new { Message = formattedEvent, Event = loggingEvent });
                }
            }
        }
    }

我正在尝试将会话ID附加到cookie,但是由于cookie被覆盖,因此无法在同一台计算机上使用。 这是我在客户端上用于附加事件的代码:

//start hubs
    $.connection.hub.start()
    .done(function () {
        console.log("hub subsystem running...");
        console.log("hub connection id=" + $.connection.hub.id);
        $.cookie("log-id", $.connection.hub.id);
        log4netHub.listen();
    });

结果,仅连接的最后一页显示日志消息。 我想知道是否有一些策略可以使来自当前请求的浏览器具有当前连接ID,如果有的话。 我也很想知道是否有更好的设计来实现每个浏览器的日志记录。

编辑

我可以制作一个基于约定名称的cookie(例如log-id-someguid),但是我想知道是否有更聪明的东西。

BOUNTY我决定开始对这个问题赏金,我会还询问有关架构,为了看看我的策略是有道理,还是没有。 我的疑问是,我正在从服务器到客户端的单个“方向”上使用集线器,并且使用它来记录不是源自对集线器的调用而是来自其他请求(可能是其他集线器上提出的请求)的活动。一个正确的方法,目标是浏览器可见的log4net附加程序?

1 个回复

即使在同一个SPA上打开多个选项卡时,如何正确定位正确的浏览器实例/选项卡的想法是通过Url区分它们。 一种实现的可能方法是在第一次访问时将它们从http://foo.com重定向到http://foo.com/hhd83hd8hd8dh3 (每次随机生成)。 URL重写也可以通过其他方式完成,但这只是说明问题的一种方式。 这样,附加程序将能够检查原始Url,并且通过保留在服务器端的某些映射从Url中可以标识正确的SignalR ConnectionId。 实现细节可能有所不同,但是基本思想就是这一点。 自第一个连接以来,您就可以跟踪HttpContext中的更多可用信息,您也可以采用其他策略来防止任何劫持。

关于您的体系结构,我可以告诉您,这正是我在ElmahR中使用它的方式。 我有来自通知中心外部的消息(从其他Web应用程序发布的错误),并且向与该中心连接的所有客户端(并订阅了某些组)进行广播:它工作正常。

我不是权威人士,但我也猜想,即使有多个集线器,这种架构也可以,因为一天结束时的集线器只是(一个)持久连接的抽象,允许您通过以下方式对消息进行分组上下文。 在幕后(我正在简化),您只有一个持久的连接,来回传递消息,因此,无论您在其上定义的集线器结构(用来帮助您组织事物),都仍然坚持该连接,这样就不会造成任何伤害。

SignalR擅长做两件事:大规模广播(客户端)和一对一通信(呼叫者)。 只要您不尝试做一些奇怪的事情,例如构建保持对特定调用者的服务器端引用,就可以了,无论有多少个集线器以及它们之间的交互。

这些是我的结论,来自实地。 也许您可以通过@dfowler询问这个问题,看看他是否有(更)权威的准则。

1 从集线器外部呼叫SignalR的客户端不起作用

我正在用一个非常简单的示例评估SignalR,以便能够从服务器调用客户端。 我已经在一个空的Visual Studio Web应用程序-Visual Studio 2012中使用Nuget安装了最新版本的SignalR。该方案是:我有一个aspx Publisher,可以通过单击发布按钮将代码 ...

2 SignalR:如何在集线器启动后添加客户端呼叫?

首先,我刚开始尝试将SignalR 2添加到现有的Angular SPA项目中。 我有一个主控制器,它立即启动集线器,向客户端发送一些消息。 在里面,我有几个子页面,每个子页面都可以订阅不同的服务中心。 问题是客户端没有收到消息,因为它已在主控制器中已启动集线器后连接。 作为测试 ...

3 从SignalR呼叫特定客户端

我想从服务器调用特定客户端,而不是向所有客户端广播。 问题是我在一些AJAX请求的范围内(在.aspx代码后面说),而不是在Hub或PersistentConnection中,所以没有Clients属性 - 而且那个调用ajax(jquery)的客户端不是客户端我想发送信号消息! 现在, ...

4 在SignalR中呼叫特定客户端

我正在开发一个SignalR应用程序,其中一组.NET控制台客户端连接到Web服务器。 如何使用SignalR从服务器调用特定客户端。 在我当前的应用程序中,当我从服务器端单击按钮时。 它会触发所有控制台客户端。 但我想要触发的是将所有客户端信息保存在server.html上并调用特 ...

6 从signalR集线器到特定客户端的Servicebus主题消息

我们正尝试将主题消息发送给曾要求此请求的杰出的已连接客户端。 集线器托管在具有持久连接的WebRole中。 截至目前已实施的方法是 1:客户端必须发出初始请求才能订阅组,此后它不会对服务器方法进行任何调用,但会等待来自服务器的消息。 2:一个在订阅方法调用之后立即为订阅客 ...

10 SignalR集线器多客户端访问

如果有人可以提供帮助,我不确定。 假设我有一个SignalR Hub类,并且有一个Dictionary作为成员。 集线器方法之一接收字符串作为参数,使用该字符串作为键并更新Dictionary中相应值的一部分。 这可能包括添加/删除字典项。 在我的方案中,可能有100个“同时”调用此 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM