首页 文章

获取SignalR中心内的完整URL

提问于
浏览
9

我正在开发一个使用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 回答

  • 4

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

  • 1

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

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

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

    然后提取你需要的东西 .

    它可以在IIS上运行,用于非IIS主机查找其他OWIN的东西https://github.com/aspnet/AspNetKatana/wiki/OWIN-Keys

  • 1

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

相关问题