2016-02-15 4 views
0

Так что я довольно новичок в signalR и работал с ним немного с MVC. Теперь я использую его в webapi с angularjs и немного запутался или забыл о том, что я сделал. Я использую токены-носители с webapi и пытаюсь создать систему уведомлений.Специальный клиент 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 - все пустые строки "". Я читал, что, возможно, это связано с использованием токенов-носителей. Если да, то как я могу использовать токены-носители для конкретного пользователя, к которому я бы хотел отправить? Когда я использую Клиенты. Все работает отлично, поэтому я предполагаю, что это должно быть что-то с запуском/userIds, который я получаю.

Благодаря

ответ

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

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 выходит за нуль для имени пользователя и authenticationType. Я считаю, что это потому, что я использую токены-носители, а не Cookies. Как мне пройти через userId/userName для Irequest? –

+0

Я не уверен, в чем ваш вопрос. Вы хотите знать, как вызвать клиента с серверной стороны, используя идентификатор соединения? Вы можете использовать метод OnConnected() 'в концентраторе SignalR на стороне сервера и добавить идентификатор соединения подключенного клиента в словарь, используя его имя хоста в качестве ключа. Затем вы можете создать экземпляр концентратора в другом месте и настроить целевые клиенты, используя идентификатор соединения в словаре. Надеюсь это поможет. –