从 Web 在 SignalR 中发送消息 API
Sending Message in SignalR from the Web API
我已经在我的网络中创建了一个中心 API。很简单:
public class DashboardHub : Hub
{
public async Task SendMessage(InfoSummary infoSummary)
{
await Clients.All.SendAsync("ReceiveMessage", infoSummary);
}
}
我正在尝试在更新数据时从同一 Web API 中的控制器向集线器发送消息。
我看到了 100 个不同的答案,但没有一个有效。基本上我的控制器中的集线器对象是空的,我似乎无法实例化它。
private readonly IRepository _repo;
private readonly Helpers.Convert _convert;
private readonly CoreContext _context;
private readonly IMapper _mapper;
private readonly NotifyService _service;
private readonly DashboardHub _hub;
public MyController(IRepository repo,
CoreContext context,
IMapper mapper)
{
_convert = new Helpers.Convert(repo, mapper);
_repo = repo;
_context = context;
_mapper = mapper;
_hub = new DashboardHub();
_service = new NotifyService(_hub);
}
[HttpPost("updatestatus")]
public async Task<IActionResult> UpdateStatus(Header header) {
var returnVal = await _repo.ChangeStatus(header.HeaderId, header.Status);
headerSummary = _convert.ToReturnStatusHeader( await _repo.GetHeader(header.HeaderId));
// await _service.SendNotificationAsync(headerSummary);
await _hub.SendMessage(headerSummary);
return Ok(returnVal);
}
我有
services.AddSignalR();
services.AddScoped(typeof(DashboardHub));
和
endpoints.MapHub<DashboardHub>("/Hubs/DashboardHub");
在 startup.cs 文件的适当部分
我知道我遗漏了一些非常小的东西,但我很想知道它是什么。
我也曾尝试创建强类型集线器,但这引入了更多问题。
提前致谢。
您可以做的是在您的控制器中使用 dependency injection 注入您的集线器。您不能像现在这样在控制器中实例化集线器,我也会将其更改为 Singleton
。
services.AddSingleton(typeof(DashboardHub));
internal DashboardHub DashboardHub
{
get
{
return this.HttpContext.RequestServices.GetRequiredService<DashboardHub>();
}
}
好吧,我觉得自己是个彻头彻尾的新手。修复非常简单。您必须添加 using 语句,告诉控制器您要使用 SignalR。 OMG..我几乎不好意思提出这个,但希望它能帮助别人。
修复:
using Microsoft.AspNetCore.SignalR;
:脸掌
你做错了四次。
您不需要将此行放在 Startup.cs 的 ConfigureServices 方法中。 services.AddScoped(typeof(DashboardHub));
删除它。只要保持 services.AddSignalR();
为什么要使用 new 关键字,因为 .net 核心提供内置依赖
注射服务。删除以下行。
_hub = new DashboardHub();
_service = new NotifyService(_hub);
而是为 NotifyService.cs 创建一个新接口 INotifyService.cs。
在 Startup.cs.
的 ConfigureServices 方法中注册此服务
services.AddScoped<INotifyService, NotifyService>();
您的MyController.cs应该如下所示
添加这一行。
using Microsoft.AspNetCore.SignalR;
private readonly IRepository _repo;
private readonly Helpers.Convert _convert;
private readonly CoreContext _context;
private readonly IMapper _mapper;
private readonly INotifyService _service;
private readonly IHubContext<DashboardHub> _hubContext
public MyController(IRepository repo, CoreContext context, IMapper mapper,INotifyService service,IHubContext<DashboardHub> hubContext)
{
_convert = new Helpers.Convert(repo, mapper);
_repo = repo;
_context = context;
_mapper = mapper;
_service = service;
_hubContext = hubContext;
}
[HttpPost("updatestatus")]
public async Task<IActionResult> UpdateStatus(Header header) {
var returnVal = await _repo.ChangeStatus(header.HeaderId, header.Status);
headerSummary = _convert.ToReturnStatusHeader( await _repo.GetHeader(header.HeaderId));
// await _service.SendNotificationAsync(headerSummary);
await hubContext.Clients.All.SendAsync("ReceiveMessage", headerSummary);
return Ok(returnVal);
}
- 如果您在 NotifyService.cs.
中发送消息,请使用相同的概念
我已经在我的网络中创建了一个中心 API。很简单:
public class DashboardHub : Hub
{
public async Task SendMessage(InfoSummary infoSummary)
{
await Clients.All.SendAsync("ReceiveMessage", infoSummary);
}
}
我正在尝试在更新数据时从同一 Web API 中的控制器向集线器发送消息。
我看到了 100 个不同的答案,但没有一个有效。基本上我的控制器中的集线器对象是空的,我似乎无法实例化它。
private readonly IRepository _repo;
private readonly Helpers.Convert _convert;
private readonly CoreContext _context;
private readonly IMapper _mapper;
private readonly NotifyService _service;
private readonly DashboardHub _hub;
public MyController(IRepository repo,
CoreContext context,
IMapper mapper)
{
_convert = new Helpers.Convert(repo, mapper);
_repo = repo;
_context = context;
_mapper = mapper;
_hub = new DashboardHub();
_service = new NotifyService(_hub);
}
[HttpPost("updatestatus")]
public async Task<IActionResult> UpdateStatus(Header header) {
var returnVal = await _repo.ChangeStatus(header.HeaderId, header.Status);
headerSummary = _convert.ToReturnStatusHeader( await _repo.GetHeader(header.HeaderId));
// await _service.SendNotificationAsync(headerSummary);
await _hub.SendMessage(headerSummary);
return Ok(returnVal);
}
我有
services.AddSignalR();
services.AddScoped(typeof(DashboardHub));
和
endpoints.MapHub<DashboardHub>("/Hubs/DashboardHub");
在 startup.cs 文件的适当部分
我知道我遗漏了一些非常小的东西,但我很想知道它是什么。
我也曾尝试创建强类型集线器,但这引入了更多问题。
提前致谢。
您可以做的是在您的控制器中使用 dependency injection 注入您的集线器。您不能像现在这样在控制器中实例化集线器,我也会将其更改为 Singleton
。
services.AddSingleton(typeof(DashboardHub));
internal DashboardHub DashboardHub
{
get
{
return this.HttpContext.RequestServices.GetRequiredService<DashboardHub>();
}
}
好吧,我觉得自己是个彻头彻尾的新手。修复非常简单。您必须添加 using 语句,告诉控制器您要使用 SignalR。 OMG..我几乎不好意思提出这个,但希望它能帮助别人。
修复:
using Microsoft.AspNetCore.SignalR;
:脸掌
你做错了四次。
您不需要将此行放在 Startup.cs 的 ConfigureServices 方法中。
services.AddScoped(typeof(DashboardHub));
删除它。只要保持
services.AddSignalR();
为什么要使用 new 关键字,因为 .net 核心提供内置依赖 注射服务。删除以下行。
_hub = new DashboardHub(); _service = new NotifyService(_hub);
而是为 NotifyService.cs 创建一个新接口 INotifyService.cs。 在 Startup.cs.
的 ConfigureServices 方法中注册此服务services.AddScoped<INotifyService, NotifyService>();
您的MyController.cs应该如下所示
添加这一行。
using Microsoft.AspNetCore.SignalR;
private readonly IRepository _repo;
private readonly Helpers.Convert _convert;
private readonly CoreContext _context;
private readonly IMapper _mapper;
private readonly INotifyService _service;
private readonly IHubContext<DashboardHub> _hubContext
public MyController(IRepository repo, CoreContext context, IMapper mapper,INotifyService service,IHubContext<DashboardHub> hubContext)
{
_convert = new Helpers.Convert(repo, mapper);
_repo = repo;
_context = context;
_mapper = mapper;
_service = service;
_hubContext = hubContext;
}
[HttpPost("updatestatus")]
public async Task<IActionResult> UpdateStatus(Header header) {
var returnVal = await _repo.ChangeStatus(header.HeaderId, header.Status);
headerSummary = _convert.ToReturnStatusHeader( await _repo.GetHeader(header.HeaderId));
// await _service.SendNotificationAsync(headerSummary);
await hubContext.Clients.All.SendAsync("ReceiveMessage", headerSummary);
return Ok(returnVal);
}
- 如果您在 NotifyService.cs. 中发送消息,请使用相同的概念