Na última versão do Asp.Net SignalR, foi adicionada uma nova forma de enviar uma mensagem para um determinado usuário, utilizando a interface "IUserIdProvider".
public interface IUserIdProvider
{
string GetUserId(IRequest request);
}
public class MyHub : Hub
{
public void Send(string userId, string message)
{
Clients.User(userId).send(message);
}
}
Minha pergunta é: Como posso saber para quem estou enviando minha mensagem? A explicação desse novo método é muito superficial. E o projecto de declaração do SignalR 2.0.0 com este bug e não compila. Alguém implementou esse recurso?
Mais informações: http://www.asp.net/signalr/overview/signalr-20/hubs-api/mapping-users-to-connections#IUserIdProvider
Abraços.
Respostas:
SignalR fornece ConnectionId para cada conexão. Para descobrir qual conexão pertence a quem (o usuário), precisamos criar um mapeamento entre a conexão e o usuário. Isso depende de como você identifica um usuário em seu aplicativo.
No SignalR 2.0, isso é feito usando o embutido
IPrincipal.Identity.Name
, que é o identificador do usuário conectado conforme definido durante a autenticação ASP.NET.No entanto, pode ser necessário mapear a conexão com o usuário usando um identificador diferente em vez de usar o Identity.Name. Para este propósito, este novo provedor pode ser usado com sua implementação customizada para mapear o usuário com a conexão.
Exemplo de mapeamento de usuários SignalR para conexões usando IUserIdProvider
Vamos supor que nosso aplicativo use um
userId
para identificar cada usuário. Agora, precisamos enviar uma mensagem para um usuário específico. TemosuserId
emessage
, mas o SignalR também deve saber o mapeamento entre nosso userId e a conexão.Para conseguir isso, primeiro precisamos criar uma nova classe que implemente
IUserIdProvider
:A segunda etapa é dizer ao SignalR para usar nosso em
CustomUserIdProvider
vez da implementação padrão. Isso pode ser feito no Startup.cs ao inicializar a configuração do hub:Agora, você pode enviar mensagem para um usuário específico usando o seu
userId
conforme mencionado na documentação, como:Espero que isto ajude.
fonte
app.MapSignalR();
global.asax antes da autenticação.Aqui está um começo .. Aberto a sugestões / melhorias.
Servidor
JavaScript
(Observe como
addChatMessage
esendChatMessage
também são métodos no código do servidor acima)Testando
fonte
É assim que você usa SignarR para atingir um usuário específico (sem usar nenhum provedor):
fonte
contextIdClient
não entendeu :(Veja Testes SignalR para o recurso.
O teste "SendToUser" obtém automaticamente a identidade do usuário passada usando uma biblioteca de autenticação regular do owin.
O cenário é que você tem um usuário que se conectou a partir de vários dispositivos / navegadores e deseja enviar uma mensagem para todas as suas conexões ativas.
fonte
Tópico antigo, mas acabei de descobrir isso em uma amostra:
fonte