Как я могу вызвать метод, который находится в моем концентраторе, с моего контроллера на ASP. NET Core? - PullRequest
1 голос
/ 16 января 2020

Я использую 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");
    }

}

1 Ответ

1 голос
/ 16 января 2020

SignalR IHubContext предоставляет средства для отправки сообщений вашим клиентам за пределами экземпляра Hub. Образец в 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();
...
...