Asp.net

獲取 SignalR 集線器內的完整 URL

  • May 22, 2017

我正在為 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();

可以通過查詢字元串參數將您的位置值等數據傳遞給 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

引用自:https://stackoverflow.com/questions/13193606