具有angularjs

时间:2016-02-15 23:25:20

标签: asp.net angularjs asp.net-web-api signalr signalr-hub

所以我对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有关。

由于

2 个答案:

答案 0 :(得分: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

答案 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);