我正在开发一个使用SignalR的用户跟踪解决方案,作为一个有趣的项目来学习SignalR,用于ASP.NET MVC应用程序 .
目前,我可以跟踪已记录的用户以及他们在特定页面上的时长 . 如果他们移动到另一个页面,我也跟踪它,并且SignalR正在更新的计时器重置...许多其他功能被实现或部分实现 .
我面临的问题是如何在SignalR集线器内获取完整的URL控制器/操作/参数?
当我使用 HttpContext.Current.Request.Url
时,网址始终为 /signalr/connect .
注意:
var hub = $.connection.myHub;
$.connection.hub.start();
在_Layout.cshtml中 .
UPDATE:
我试过用
var location = '@HttpContext.Current.Request.Url';
var hub = $.connection.myHub;
$.connection.hub.start().done(function () {
hub.setLocation(location);
});
并且位置正确传递但我不需要在Connect()任务上使用它 . 是否有可能做到这一点?
UPDATE 2:
这种方法不起作用
var hub = $.connection.myHub;
$.connection.hub.start(function(){hub.setLocation(location)});
因为 Connect()
之前被调用过 .
在我的集线器中我有几种方法,但我想将值(在我的情况下是一个位置)传递给 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
}
}
Update 3
使用QueryString在 Connect()
发生之前传递数据 .
var location = '@HttpContext.Current.Request.Url';
var hub = $.connection.myHub;
$.connection.hub.qs = "location= + location;
$.connection.hub.start();
3 回答
可以通过查询字符串参数将类似位置值的数据传递给Connect():SignalR: How to send data to IConnected.Connect()
使用查询字符串不是很安全,导致黑客可以伪造JS代码并向您发送错误的位置,从而破坏其背后的任何逻辑 .
您可以尝试从owin-enviromment变量中获取此信息
var underlyingHttpContext = Context.Request.Environment[typeof(HttpContextBase).FullName] as HttpContextBase;
然后提取你需要的东西 .
它可以在IIS上运行,用于非IIS主机查找其他OWIN的东西https://github.com/aspnet/AspNetKatana/wiki/OWIN-Keys
您可以将它从客户端js调用传递到您的集线器作为参数 .