2015-12-13 73 views
3

我有一個問題,我如何從應用程序控制器獲取userId?我看到很多樣本,如何從Hubs中獲得。但我不知道我還沒有任何標識的情況下以其他方式我怎樣才能調用樞紐來自控制器然後SignalR從控制器獲取用戶ID

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 

我看到這樣的樣本,在這裏我可以調用上下文並獲取UserId,但這隻能在Hub中使用。

var name = context.User.Identity.Name; 

我知道我可以做這樣的事情:

public class MyHub : Hub 
{ 
    public void Send(string userId, string message) 
    { 
     Clients.User(userId).send(message); 
    } 
} 

但我必須從控制器調用樞紐。

感謝您的幫助

回答

0

我找到了解決方案。

順便說一句,謝謝你的回答。

我嘗試從應用程序控制器調用的類中使用signalR。 在課堂上,我沒有任何有關調用服務器的用戶的上下文和特殊數據。

但我發現控制器有關哪個用戶調用服務器的信息。

this.User.Identity.Name 

快樂編碼;)

1

如果你有某種身份驗證的應用程序中,一個好主意,也許是保留用戶和連接之間的映射。

這樣,無論何時您想向用戶發送消息,只需檢索所有該用戶的connectin ID並將消息發送給所有人。

foreach(var connectionId in UserMapping) 
     context.Clints.Client(connectionId).sendMessage(message); 

這樣,您就能夠從輪轂外面消息發送到特定的客戶,你是確保客戶端的所有實例得到通知。

看看here for more information on Mapping SignalR Users to Connections.

希望這有助於。

祝你好運!

3

我可以建議一個稍微不同的方法。通常情況下,從信號環境外插入集線器不能很好地工作,或者至少使事情變得更加複雜。

您可以讓控制器充當集線器本身的客戶端,並通過集線器將需要的信息公開給控制器。所有你需要的是SignalR Desktop Client package。雖然它增加了開銷,但您將擁有更加合規的數據恢復方式,並且可以很好地區分問題。

這是我回復的similar question。 HTH。