所以我对signalR相当新,并且曾经使用过MVC。现在我在webapi中使用它与angularjs,我有点困惑或忘记了我做了什么。我正在使用带有webapi的持有者令牌,并且我正在尝试创建一个通知系统。
我想弄清楚的是使用angularjs和signalR的正确方法。我看到很多人在/ 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());
}
当我刷新页面时,我注意到我的所有用户ID都是空字符串“”。我正在读,也许这是因为使用了持票令牌。如果是这样,我将如何使用bearer令牌来特定我想要发送给的userId?当我使用Clients.All一切正常,所以我假设它必须与我得到的startup / userIds有关。
由于
答案 0 :(得分:1)
回答你的第一个问题:
这是使用通知系统的最佳方式
如果要将通知从服务器推送到客户端,则必须定义新的处理程序,以在客户端(使用生成的代理)上定义方法,如下所示:
How to define methods on the client that the server can call
如果您希望客户端调用位于服务器上的方法,则必须使用此方法:
How to call server methods from the client
回答你的第二个问题:
对于向特定用户发送请求,我认为您会想要 在集线器上执行此操作
您可以使用您希望定位的客户端的connection ID
。见:
答案 1 :(得分:1)
过了一会儿,我找到了正确的答案。因为我使用的是bearerTokens,所以我必须确定另一种获取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);