Como posso chamar/invocar o método Hubs "DisconnectFromConversation" do meu controlador de API
Implementação de hubs
public class ChatHub : Hub
{
private readonly IConversationService \_converstaionService;
private readonly IMemberService \_converstaionUserService;
private readonly IMessageService \_messageService;
public ChatHub(IConversationService converstaionService,
IMemberService converstaionUserService, IMessageService messageService)
{
_converstaionService = converstaionService;
_converstaionUserService = converstaionUserService;
_messageService = messageService;
}
public async Task DisconnectFromConversation(Guid conversationId, Guid userId)
{
if (ConnectionMapping.TryGetValue(userId, out var connectionIds))
{
foreach (var connectionId in connectionIds)
{
await Groups.RemoveFromGroupAsync(connectionId, conversationId.ToString());
}
}
}
Implementação de controladores
public class MemberController : ControllerBase
{
private readonly IMemberService \_memberService;
private readonly IConversationService \_conversationService;
private readonly IHubContext\<ChatHub\> \_hubContext;
public MemberController(IMemberService memberService, IConversationService conversationService, IHubContext<ChatHub> hubContext)
{
_memberService = memberService;
_conversationService = conversationService;
_hubContext = hubContext;
}
[HttpDelete("conversations/{conversationId}")]
public async Task<IActionResult> DeleteMember([FromBody]string userId, Guid conversationId)
{
var test = Request.Headers["connectionId"];
if (!Request.Headers.ContainsKey("User-Id"))
{
return BadRequest();
}
else if (await _conversationService.IsUserCreator(conversationId,
new Guid(Request.Headers["User-Id"]))
|| Request.Headers["User-Id"] == userId.ToString())
{
await _memberService.DeleteMemberAsync(conversationId, new Guid(userId));
//await _hubContext.Clients.All
.BrodacastMessage("DisconnectFromConversation", conversationId, userId);
await _hubContext.Clients.Client(test)
.SendAsync("DisconnectFromConversation", conversationId, userId);
return NoContent();
}
else
{
return Forbid();
}
}
}
Tentei invocar da próxima maneira, await _hubContext.Clients.All.BrodacastMessage("DisconnectFromConversation", conversationId, userId);
mas no modo de depuração ele não aciona o ponto de interrupção no método hub. Também tentei, await _hubContext.Clients.Client(test).SendAsync("DisconnectFromConversation", conversationId, userId);
estava pensando em delegar essa ação ao lado do cliente. Mas infelizmente não tenho (é um dos requisitos da Task)
Usando ...
tentará chamar um método do lado do cliente chamado "DisconnectFromConversation".
O IHubContext<T> dá acesso a grupos, clientes, etc. para enviar mensagens ao cliente, mas não dá acesso a métodos declarados no hub do lado do serviço.
Mova o método para um serviço e injete o IHubContext nele para que você possa acessar os grupos, clientes, etc. do IHubContext, por exemplo:
Em seguida, injete esse serviço no chathub e no controlador do servidor:
e