2016-02-15 117 views
0

所以我對signalR相當新,並與MVC一起工作。現在我用angularjs在webapi中使用它,並且有點困惑或者忘記了我所做的。我正在使用帶有webapi的持票人標記,並試圖創建通知系統。SignalR客戶端特定與angularjs

我想知道的是在signalR中使用angularjs的正確方法。我看到很多人在/ invoke上使用代理。是proxy.on是,當我致電hubcontext從服務器像這樣:

IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>(); hubContext.Clients.User(UserId).broadcastNotification("Good morning! The time is " + DateTime.Now.ToString());

和proxy.invoke方法是從客戶端?如果是這樣,這將是使用通知系統的最佳方式(我會假設proxy.on)?

我的第二個問題是更多地向特定用戶發送通知。對於將請求發送給特定的用戶,我會假設你想做到這一點的輪轂爲這樣:

public void SendNotification(string userId) { Clients.User(userId).broadcastNotification("Good morning! The time is " + DateTime.Now.ToString()); }

我的啓動是這樣的:

public class MyProvider : IUserIdProvider 
    { 
     public string GetUserId(IRequest request) 
     { 
      var userId = request.User.Identity.Name; 
      return userId.ToString(); 
     } 
    } 
    public void Configuration(IAppBuilder app) 
    { 
     HttpConfiguration config = new HttpConfiguration(); 
     ConfigureOAuth(app); 
     WebApiConfig.Register(config); 
     app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); 
     app.UseWebApi(config); 
     Database.SetInitializer(new MigrateDatabaseToLatestVersion<AuthContext, Travelfy.API.Migrations.Configuration>()); 
     GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider),() => new MyProvider()); 
     app.MapSignalR("/hubs", new HubConfiguration()); 

    } 

當我刷新我的網頁,我注意到我所有的userid都是空字符串「」。我正在閱讀,也許這是由於使用持票人令牌。如果是這樣,我將如何使用持票人標記來指定我想要發送給的用戶標識?當我使用Clients.All一切工作正常,所以我假設它必須是啓動/ userIds我得到的東西。

感謝

回答

1

所以過了一段時間,我能夠找出正確的答案。因爲我使用的是bearerToken,所以我必須確定另一種獲取userId的方法,而不是僅僅依賴request.User.Identity.Name。我需要做的是將我的bearerToken傳遞給connection.qs值。

connection.qs = { Bearer: token };

一旦我能做到這一點,我不得不路由查找基於令牌我的用戶,我在送了。

var token = request.QueryString.Get("Bearer"); var authenticationTicket = Startup.OAuthBearerOptions.AccessTokenFormat.Unprotect(token);

1

要回答你的第一個問題:

這將是使用通知系統

如果你想從服務器向客戶端推送通知的最佳途徑,你必須定義一個新的處理程序,就是在客戶機上定義一個方法(使用生成的代理),如下所示:

How to define methods on the client that the server can call

如果你希望客戶端調用位於服務器上的一個方法,你必須使用這個方法:

How to call server methods from the client

要回答你的第二個問題:

要發送要求特定用戶,我會假設你想 在集線器上做到這一點

您可以使用您想要定位的客戶端的connection ID。看到這一點:

Calling client methods

+0

感謝。當我有機會時,我會看看這個。很可能會有更多的問題。 –

+0

我相信我的問題是關於Irequest值MyProvider對於userName和authenticationType來說是空的。我相信這是因爲我使用的是持有者令牌而不是Cookie。我如何通過Irequest的userId/userName? –

+0

我不確定你的問題是什麼。你想知道如何使用連接ID從服務器端調用客戶端?您可以在服務器端的SignalR集線器中使用「OnConnected()」方法,並使用其主機名作爲密鑰將連接的客戶端的連接ID添加到字典中。然後,您可以在其他地方實例化集線器,並使用字典中的連接ID定位特定客戶端。希望這可以幫助。 –