2015-11-02 1 views
3

Я создаю приложение чата в MVC, используя signalR. Я знаю, как получить идентификатор ConnectionID от концентратора. Но можно ли получить тот же идентификатор соединения от контроллера?Получение идентификатора подключения клиента из класса контроллера в MVC

Я пробовал использовать HttpContext и OwinContext, но из нескольких свойств я не смог найти свойство ConnectionId. Даже в свойствах запроса HttpContext.

Может ли кто-нибудь дать представление?

В этом post_ How to obtain connection ID of signalR client on the server side?

_The первый ответ советует вам иметь концентратор вызова внешнего метода.

Мне известно о дизайне, в котором мы держим словарь, который сопоставляет каждому пользователю несколько идентификаторов ConnectionIds для нескольких устройств.

Но предположим, что есть UserController, у которого есть действие LogIn и LogOut. Было бы проще, если бы я смог получить connectionId пользователя, который только что вошел в систему. Тогда я просто получил бы его идентификатор пользователя из DbContext и сохранил бы его ранее упомянутый словарь, который впоследствии может использоваться концентратором.

+1

вы можете получить его на стороне клиента, а затем отправить значение контроллер. Будет ли это приемлемо? –

+1

Возможный дубликат: http://stackoverflow.com/questions/20908620/how-to-obtain-connection-id-of-signalr-client-on-the-server-side – Nikolay

ответ

1

Вы можете использовать $.connection.hub.id в своем JavaScript на стороне клиента и Context.connectionId в своем концентраторе SignalR (see here), чтобы получить идентификатор соединения пользователя.

После этого вы можете делать все, что хотите, вы можете отправить его с клиентской стороны через AJAX на контроллер или с сервера на свой клиент из своего концентратора SignalR.

Если вам требуется восстановить идентификатор соединения SignalR, который еще не был сохранен в какой-либо форме (сеансы, база данных) из контроллера, это звучит как запах кода для меня.

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

Если проблема заключается в том, что код, который вы хотите выполнить, уже существует в вашем контроллере, и вы хотите использовать его, и вы не хотите, чтобы он существовал в двух местах, вы должны переместить этот код в сервисный уровень (бизнес слой) и добавьте его как зависимость от вашего контроллера и вашего концентратора SignalR.

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

В ступицах , вы можете получить идентификатор пользователя, который делает вызов на ступицу и вернуть сообщение обратно к ним их имени пользователя или идентификатор пользователя:

public MyHub : Hub 
{ 
    public void FirstMethod() 
    { 
     // Invoke method to the current caller to the hub 
     Clients.Client(connectionId).clientMethod(); 
    } 

    public void SecondMethod() 
    { 
     // Get user id of the person making the call 
     var userId = this.User.Identity.GetUserId(); 

     // Invoke method on the client side 
     Clients.User(userId).clientMethod(); 
    } 
} 
+0

Если я хочу войти в систему " index.cshtml ". Затем перейдите на страницу «chat.cshtml», чтобы начать чат. Теперь в этом случае, как я могу сопоставить свой UserID с моим идентификатором соединения? Моя идея была с тех пор, как вход осуществляется контроллерами, поэтому было бы полезно добавить эту запись в действие входа в контроллер (например, UserController). –

+0

Когда вы устанавливаете соединение в чате.cshtml', ваше соединение SignalR автоматически присваивается идентификатору пользователя – Luke

+0

да из этого сообщения (http://www.asp.net/signalr/overview/guide-to-the-api/mapping-users-to-connections) I узнал, что IUserId Provider предоставит мне UserId. Я пытаюсь реализовать с помощью второго метода в этом сообщении (т. Е. Использовать память в памяти), предполагая, что я буду иметь больше контроля над хранением информации. –