如何从 ASP.NET Core 上的控制器调用集线器中的方法?

How can I call the method that is in my Hub from my controller on ASP.NET Core?

我正在使用 SignalR,我的中心位于一个名为 Hubs 的文件夹中。我需要在我的控制器上调用集线器 "PostMarker()" 中的方法。因此,每次发布内容时,SignalR 都会更新所有 windows 打开的内容。我应该怎么做?

  [HttpPost]
    public async Task<IActionResult> PostOcorrencias([FromBody] Ocorrencias ocorrencia, IFormFile UploadImag)
    { 

        ocorrencia.DataOcorrencia = DateTime.Now;

        //processar a fotografia
        //ocorrencia.Fotografia = "(nome fotografia)";
        string caminho = "";


        if (UploadImag == null)
        {
            return BadRequest(ModelState);
        }
        else
        {
            if (UploadImag.ContentType == "imagens/jpg" ||
                UploadImag.ContentType == "imagens/png")
            {
                string extensao = Path.GetExtension(UploadImag.FileName).ToLower();
                Guid g;
                g = Guid.NewGuid();
                string nome = g.ToString() + extensao;
                caminho = Path.Combine(environment.WebRootPath,"imagens", nome);
                ocorrencia.Fotografia = nome;
                // Cria o ficheiro no sistema
                using (var stream = new FileStream(caminho, FileMode.Create))
                {
                    await UploadImag.CopyToAsync(stream);
                }

            }
        }

            _context.Ocorrencias.Add(ocorrencia);
           //CALL HUB METHOD PostMarker()
            await _context.SaveChangesAsync();
        }

        return CreatedAtAction("GetOcorrencias", new { id = ocorrencia.Id }, ocorrencia);
    }

这是我的中心:

  public class MyHub : Hub
{
    public async Task PostMarker()
    {
        await Clients.All.SendAsync("RedesignMap");
    }

}

SignalR IHubContext 提供了一种向集线器实例之外的客户端发送消息的方法。 https://docs.microsoft.com/en-us/aspnet/core/signalr/hubcontext?view=aspnetcore-3.1 中的示例提供了一个示例。使用此处的代码作为起点,您可以:

IHubContext 注入你的控制器,假设它被命名为 HomeController:

public class HomeController : Controller
{
    private readonly IHubContext<MyHub> _hubContext;

    public HomeController(IHubContext<MyHub> hubContext)
    {
        _hubContext = hubContext;
    }
}

在您的 PostOcorrencias 控制器操作中使用集线器上下文:

...
_context.Ocorrencias.Add(ocorrencia);
await _hubContext.Clients.All.SendAsync("RedesignMap");
await _context.SaveChangesAsync();
...