Asp.net 获取信号器中心内的完整URL
我正在为ASP.NET MVC应用程序开发一个使用SignalR的用户跟踪解决方案,这是学习SignalR的一个有趣的项目 目前,我可以跟踪已登录的用户以及他们在特定页面上的停留时间。如果他们移动到另一个页面,我也会跟踪它,信号器正在更新的计时器会重置。。。许多其他功能已实现或部分实现 我面临的问题是如何获取完整的url控制器/操作/参数 信号中心内部 当我使用Asp.net 获取信号器中心内的完整URL,asp.net,asp.net-mvc-4,signalr,signalr-hub,Asp.net,Asp.net Mvc 4,Signalr,Signalr Hub,我正在为ASP.NET MVC应用程序开发一个使用SignalR的用户跟踪解决方案,这是学习SignalR的一个有趣的项目 目前,我可以跟踪已登录的用户以及他们在特定页面上的停留时间。如果他们移动到另一个页面,我也会跟踪它,信号器正在更新的计时器会重置。。。许多其他功能已实现或部分实现 我面临的问题是如何获取完整的url控制器/操作/参数 信号中心内部 当我使用HttpContext.Current.Request.Url时,Url总是/signal/connect 注: var hub = $
HttpContext.Current.Request.Url
时,Url总是/signal/connect
注:
var hub = $.connection.myHub;
$.connection.hub.start();
位于_Layout.cshtml中
更新:
我试着用
var location = '@HttpContext.Current.Request.Url';
var hub = $.connection.myHub;
$.connection.hub.start().done(function () {
hub.setLocation(location);
});
并且正确地传递了位置,但我需要它在Connect()任务中,不要迟。
有可能这样做吗
更新2:
这种方法行不通
var hub = $.connection.myHub;
$.connection.hub.start(function(){hub.setLocation(location)});
因为前面调用了Connect()
在我的hub中,我有几种方法,但我想将一个值(在我的示例中是一个位置)传递给Connect()
,这可能吗
public class MyHub : Hub, IDisconnect, IConnected
{
public Task Connect()
{
//do stuff here
//and i would like to have the **location** value
}
public Task Disconnect()
{
//do stuff here
}
}
更新3
在发生Connect()
之前,使用QueryString传递数据
var location = '@HttpContext.Current.Request.Url';
var hub = $.connection.myHub;
$.connection.hub.qs = "location= + location;
$.connection.hub.start();
您可以将它作为参数从客户端js调用传递到中心。可以通过querystring参数将位置值之类的数据传递给Connect():使用查询字符串不是很安全,因为黑客可以伪造js代码并发送错误的位置,从而破坏您的逻辑 您可以尝试从owin环境变量中获取此信息
var underyinghttpcontext=
Context.Request.Environment[typeof(HttpContextBase).FullName]作为HttpContextBase代码>
然后提取你需要的任何东西
它将在IIS上工作,对于非IIS托管,请查找其他OWIN内容谢谢您的回复。我已经更新了这个问题。这个问题有什么解决办法吗?你能不能先把它放在start()中,这样就够早了。e、 g.hub.start(funcoint(){hub.setLocation(location);})而不是在完成.Connect()任务时,我不清楚您的确切意思。谢谢。我真的不知道谷歌或Stackoverflow的建议是如何让我找到你的答案的。。。您是否仍在使用此跟踪解决方案。。。你介意分享它的代码吗?@jalchr我不介意,但是NDA会;(如果您有任何问题,我将帮助您/指出正确的方向。提示:对于用户跟踪,您需要确保Signal在页面完全加载所有资源之前立即连接:waitForPageLoad
,因此请确保设置: