如何从 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();
...
我正在使用 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();
...