如何解决SignalR-发送消息AllExcept不起作用Aspnet Core 2.1
我正在尝试向连接到集线器的所有用户发送消息,但向控制器发出请求的用户除外,但是AllExcept()方法正在向所有用户发送消息。
我将解释到目前为止我做了什么。
我有一个使用signalR 3.18的Aspnet Core 2.1应用程序(我不确定版本是3)
这是我的Hub类
$data = ['products' => ['desk' => ['price' => 100]]];
$price = data_get($data,'products.desk.price');
// 100
我正在通过控制器中的依赖项注入来使用集线器,因此请遵循我的控制器。 我不会发布整个控制器,只是一部分。
v-if="inputType.includes('text')"
在控制器中的create方法和try中,我通过SignalR发送消息,所有发送均正常进行,但本节未做应有的工作。
public class MesHub : Hub
{
public async Task Cadastrar()
{
await Clients.All.SendAsync("ReceberCadastro",true,"deu certo");
}
public override Task OnConnectedAsync()
{
string name = Context.User.Identity.Name;
Groups.AddToGroupAsync(Context.ConnectionId,name);
return base.OnConnectedAsync();
}
}
根据我的理解,此摘录应将消息发送给所有用户,但那些调用create方法的用户除外,但是这没有发生。该消息无例外地发送给所有人。
在_Layout.cshtml中,我具有以下代码以连接到集线器
private readonly TipoEstoqueService _context;
private readonly UsuarioService _userContext;
private readonly IHubContext<MesHub> _hubContext;
public TipoEstoqueController(TipoEstoqueService context,UsuarioService userContext,IHubContext<MesHub> hubContext)
{
_context = context;
_userContext = userContext;
_hubContext = hubContext;
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(TipoEstoque obj)
{
string idUser = this.User.Identity.Name;
/*verifica se post é valido. Se o js estiver desabilitado no navegador do usuario
ele consegue dar post vazio,esse if serve para previnir isso*/
if (!ModelState.IsValid)
{
return View(obj);//teve algum campo q n foi preenchido
}
if (await _context.VerificaNome(obj.Nome,-1)) // se ja existe o nome
{
await _hubContext.Clients.Group(idUser).SendAsync("TipoEstoqueCadastradoFalha","Este Nome já existe");
return Json("Erro: Este Nome já existe");
}
try
{
await _context.InsertAsync(obj);
//informa ao usuario q esta cadastrando,q o cadastro funcionou
await _hubContext.Clients.Group(idUser).SendAsync("TipoEstoqueCadastradoSucesso","O Tipo do Estoque foi adicionado com sucesso.");
//atualiza a lista pra tds
await _hubContext.Clients.All.SendAsync("AtualizaListagemTipoEstoque",true);
//informa para tds q foi feito um novo cadastro
await _hubContext.Clients.AllExcept(idUser).SendAsync("NovoTipoEstoqueFoiCadastradoSucesso",idUser+" cadastrou um Tipo de Estoque.");
}
catch (Exception)
{
await _hubContext.Clients.Group(idUser).SendAsync("TipoEstoqueCadastradoFalhaException","Houve uma exceção ao tentar cadastrar,tente novamente.");
}
return Json("Success");
}
在这里,我有一个名为Index.cshtml的视图,等待来自中心的消息
//informa para tds q foi feito um novo cadastro
await _hubContext.Clients.AllExcept(idUser).SendAsync("NovoTipoEstoqueFoiCadastradoSucesso",idUser+" cadastrou um Tipo de Estoque.");
有人可以告诉我我在做什么错吗??
如果缺少任何信息,请告诉我我会张贴。
解决方法
Identity中的userId与Hub上下文中的ConnectionId不同。
await _hubContext.Clients.AllExcept(idUser)...
对于集线器,上面的 idUser未知。
您需要在集线器的连接ID上关联身份的用户ID:
1-声明以下课程:
public class CustomUserIdProvider : IUserIdProvider
{
public virtual string GetUserId(HubConnectionContext connection)
{
return connection.GetHttpContext().User?.FindFirst(ClaimTypes.NameIdentifier)?.Value
}
}
在您的DI设置中,添加以下行:
services.AddSingleton<IUserIdProvider,CustomUserIdProvider>();
在此之后,再次测试!
注意:我认为您不需要此行来覆盖OnConnectedAsync:
Groups.AddToGroupAsync(Context.ConnectionId,name);
对于特定用户的发送消息,您可以编写以下代码(其中idUser是Identity的ID):
await _hub.Clients.Users(idUser).SendAsync ...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。