【发布时间】:2012-09-06 07:39:03
【问题描述】:
我知道Chris Fulstow project log4net.signalr,如果您想要一个非生产日志,这是一个好主意,因为它会记录来自所有请求的所有消息。我希望有一些东西可以通过发起它们的请求来区分日志消息并返回到正确的浏览器。
这是我在 appender 中所做的:
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 ),但我想知道是否有更聪明的方法。
赏金 我决定在这个问题上开始悬赏,我还会询问架构,以查看我的策略是否有意义。 我的疑问是,我在从服务器到客户端的单一“方向”上使用集线器,我用它来记录不是源自对集线器的调用而是源自其他请求(可能是在其他集线器上提出的请求)的活动,是这是一个正确的方法,目标是浏览器可见的 log4net 附加程序?
【问题讨论】:
-
我从来不需要解决这样的问题,我想到的唯一方法是重写一些 url,以便通过 url 或组合唯一标识每个浏览器/选项卡实例url和cookies
-
@Wasp 问题应用程序是一个 SPA :) 我编辑问题以提出一个额外的想法,看看它是否有意义
-
我猜对了 :) 但我仍然认为你可以想出一些智能路由规则,在 url 中生成一种唯一的 id 并以某种方式处理。愚蠢的想法,用户转到foo.com,然后您在第一次连接时将他重定向到foo.com/n2998fhn239,并将其保留在您的SPA中
-
@Wasp 好主意,我有点担心 wole 架构不正确。但是关于同一主题的其他示例不区分客户端会话。
-
我认为这是唯一适用于任何(非侏罗纪)浏览器的解决方案。结合一些生成的 cookie 和 url,您应该能够防止劫持,然后 SignalR 完成剩下的工作。我找不到极端案例,但也许只有我一个人 :)
标签: asp.net-mvc signalr signalr-hub