【问题标题】:Get full URL inside SignalR hub获取 SignalR 集线器内的完整 URL
【发布时间】:2012-11-02 10:39:38
【问题描述】:

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

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

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

当我使用HttpContext.Current.Request.Url 时,网址始终是/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

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

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

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

【问题讨论】:

  • 你好......你还在研究这个跟踪解决方案......你介意分享它的代码吗?
  • @jalchr 我不介意,但 NDA 会;(如果您有任何问题,我会很乐意帮助/指出正确的方向。
  • 提示:对于用户跟踪,您需要确保 SignalR 在页面完全加载所有资源之前立即连接:waitForPageLoad,因此请确保设置:stackoverflow.com/questions/32856436/…

标签: asp.net asp.net-mvc-4 signalr signalr-hub


【解决方案1】:

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

【讨论】:

  • 谢谢。我真的不知道 Google 或 Stackoverflow 的建议怎么没有让我得到你的答案。
【解决方案2】:

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

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

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

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

它可以在 IIS 上运行,对于非 IIS 主机,请查找其他 OWIN 内容https://github.com/aspnet/AspNetKatana/wiki/OWIN-Keys

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 感谢您的回复。我已经更新了这个问题。这个问题有什么解决办法吗?
    • 你能不能不把它放在start()中,够早了吧。例如hub.start(funcoint () { hub.setLocation(location); }) 而不是完成。
    • Connect() 任务,我不清楚你的意思是什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 2022-08-09
    • 1970-01-01
    • 2017-04-22
    相关资源
    最近更新 更多