【问题标题】:How can I call the method that is in my Hub from my controller on ASP.NET Core?如何从 ASP.NET Core 上的控制器调用集线器中的方法?
【发布时间】:2020-01-16 16:33:50
【问题描述】:

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

  [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");
    }

}

【问题讨论】:

  • 您是否考虑过将 IHubContext 注入您的控制器? docs.microsoft.com/en-us/aspnet/core/signalr/…
  • 当我在我的控制器上添加这个部分时“_hubContext = hubContext;”它不识别 _hubContext。它说不能将只读字段分配给(在构造函数或变量初始化程序中除外)
  • 我链接到的页面上的第一个代码 sn-p (1) 定义了只读字段,并且 (2) 在控制器的构造函数中分配了它。您是否在代码中添加了第 (2) 步?
  • 在谈论这部分吗? "app.Use(async (context, next){...});"

标签: asp.net-mvc asp.net-core model-view-controller signalr


【解决方案1】:

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();
...

【讨论】:

  • 就是这样!谢谢
猜你喜欢
  • 1970-01-01
  • 2018-12-18
  • 2021-09-19
  • 2023-03-05
  • 1970-01-01
  • 2021-09-06
  • 2018-10-15
  • 1970-01-01
  • 2021-06-15
相关资源
最近更新 更多