2016-08-31 2 views
3

Я пытаюсь создать возможность связи в режиме реального времени для приложения Phonegap/Cordova. Я использую SignalR 2 для обработки сообщения.Специальный пользователь в приложении Phonegap/Cordova с помощью SignalR 2

Вещь, с которой я борюсь, получает сообщение конкретному пользователю. Каждый отдельный пример показывает сохранение Context.User.Identity.Name, которое бесполезно для меня, потому что контекст User.Identity удаленного сайта не используется моим телефоном.

В сущности, я не аутентифицирую пользователя в традиционном смысле, поэтому мне нужен другой способ связывания идентификатора соединения SignalR с именем пользователя, которое я передаю.

Взято из официального сигнала ASP.NET ASP.NET. У меня есть следующий код, который переопределяет событие OnConnected. К сожалению, она не принимает никаких параметров и ожидает User.Identity быть не равно нулю:

public override Task OnConnected() 
    { 
     using (var db = new UserContext()) 
     { 
      // Retrieve user. 
      var user = db.Users 
       .Include(u => u.Rooms) 
       .SingleOrDefault(u => u.UserName == Context.User.Identity.Name); 

      // If user does not exist in database, must add. 
      if (user == null) 
      { 
       user = new User() 
       { 
        UserName = Context.User.Identity.Name 
       }; 
       db.Users.Add(user); 
       db.SaveChanges(); 
      } 
      else 
      { 
       // Add to each assigned group. 
       foreach (var item in user.Rooms) 
       { 
        Groups.Add(Context.ConnectionId, item.RoomName); 
       } 
      } 
     } 
     return base.OnConnected(); 
    } 

Теперь, возможно, что мне нужно, чтобы иметь версию этого метода, который принимает строку в качестве параметра, а затем я бы используйте это как мой идентификатор пользователя.

Но как это сделать?

+0

Ну спасибо за upvotes в любом случае. –

ответ

1

Вам необходимо создать нового пользователя IUserIdProvider для пользователя и использовать инъекцию зависимостей, чтобы зарегистрировать своего провайдера и использовать его.

public interface IUserIdProvider 
{ 
    string GetUserId(IRequest request); 
} 

Зарегистрируйте Ваш провайдер с глобальной принимающей

GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider),() => new MyIdProvider()); 

Использование:

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

Взято из: http://www.asp.net/signalr/overview/guide-to-the-api/mapping-users-to-connections#IUserIdProvider