我试图在新的dotnet core2.1中使用signalR。我已经设置了C#服务器,并准备了一个离子3应用程序作为客户端。我得到了他们之间成功的websocket连接。当我尝试使用从服务器到客户端的SendAsync时,即使连接成功,客户端也显示为null。
我已经完成了一些测试,甚至尝试使用OnConnectedAsync覆盖来查看发生了什么。它确实触发但context.user.identity.name为空,客户端仍然为null。
在浏览器日志中:
Information: WebSocket connected to ws://localhost:xxxx/myHub
在我的中心
public async Task Send(string message)
{
await Clients.All.SendAsync("SendMessage", message);
}
控制器中的
public async Task<IActionResult> NewBuild()
{
await myHub.Send("New Build Completed.");
return Ok();
}
在我的创业公司
services.AddCors(options => options.AddPolicy("CorsPolicy",
builder =>
{
builder.AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin().AllowCredentials();
}));
services.AddSignalR();
app.UseCors("CorsPolicy");
app.UseSignalR(routes =>
{
routes.MapHub<myHub>("myHub");
});
和离子
hubConnection: HubConnection;
this.hubConnection = new HubConnection('http://localhost:xxxx/myHub', {
transport: TransportType.WebSockets
});
this.hubConnection.on("SendMessage", () => {
this.InitTodayBuilds();
});
this.hubConnection.start().catch(() => console.error);
正如我所说,似乎连接得很好。但是当调用Send方法时,它会得到一个null异常。
我在这里错过了一些愚蠢的东西吗? 任何帮助表示赞赏!
答案 0 :(得分:2)
我遇到了同样的问题。我将IHubContext注入到我的集线器类中,以便为服务器端调用客户端方法。
public class ChangeRequest: Hub, ITransientDependency
{
public IAbpSession AbpSession { get; set; }
protected IHubContext<ChangeRequest> _context;
public ILogger Logger { get; set; }
public ChangeRequest(IHubContext<ChangeRequest> context)
{
AbpSession = NullAbpSession.Instance;
Logger = NullLogger.Instance;
_context = context;
}
public async Task SendMessage(string message)
{
await _context.Clients.All.SendAsync("getMessage", string.Format("User {0}: {1}", AbpSession.UserId, message));
}
}