11

我正在为 ASP.NET MVC 应用程序开发一个使用 SignalR 的用户跟踪解决方案,作为一个学习 SignalR 的有趣项目。

目前我可以跟踪登录的用户以及他们在特定页面上的停留时间。如果他们移动到另一个页面,我也会跟踪它,并且 SignalR 正在更新的计时器会重置......许多其他功能已实现或部分实现。

我面临的问题是如何在 SignalR 集线器中获取完整的 url Controller/Action/Parameters?

当我使用HttpContext.Current.Request.Urlurl 总是/signalr/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()之前所说的那样。

在我的集线器中,我有几种方法,但我想将一个值(在我的情况下是一个位置)传递给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

使用 QueryString 在发生之前传递数据Connect()

var location = '@HttpContext.Current.Request.Url';

var hub = $.connection.myHub;
$.connection.hub.qs = "location= + location;
$.connection.hub.start();
4

3 回答 3

5

可以通过查询字符串参数将您的位置值等数据传递给 Connect():SignalR: How to send data to IConnected.Connect()

于 2012-11-02T19:15:22.110 回答
4

使用查询字符串不是很安全,因为黑客可以伪造 JS 代码并向您发送错误的位置,从而破坏您背后的任何逻辑。

您可以尝试从 owin-enviromment 变量中获取此信息

var underlyingHttpContext = Context.Request.Environment[typeof(HttpContextBase).FullName] as HttpContextBase;

然后提取你需要的任何东西。

它将在 IIS 上运行,对于非 IIS 托管寻找其他 OWIN 东西https://github.com/aspnet/AspNetKatana/wiki/OWIN-Keys

于 2017-05-22T10:19:22.323 回答
1

您可以将它作为参数从您的客户端 js 调用传递到您的集线器。

于 2012-11-02T10:50:06.673 回答