我正在使用ASP.NET Core 2.2和SignalR构建网站。
SignalR的主要用途是在提交捐赠时发出通知。我有一个运行Quartz.net的计划作业,该作业会发送最新捐赠的通知。
在预定的作业中,我注入了IServiceScopeFactory
的实例,并使用它来创建一个IHubContext<CampaignHub>
,如下所示(为清楚起见,省略了相关代码)...
public class DonationsNotifierJob : IJob {
private readonly IServiceScopeFactory _scopeFactory;
public DonationsNotifierJob(IServiceScopeFactory scopeFactory) =>
_scopeFactory = scopeFactory;
public async Task Execute(IJobExecutionContext context) {
using (IServiceScope scope = _scopeFactory.CreateScope()) {
IHubContext<CampaignHub> hubContext = scope.ServiceProvider
.GetRequiredService<IHubContext<CampaignHub>>();
await hubContext.Clients.All
.SendAsync("UpdatedCampaignData", new LiveCampaignData {
// Data loaded here...
});
}
}
}
应该接收通知的页面之一的Razor包含以下JavaScript ...
var connection = new signalR.HubConnectionBuilder()
.withUrl("/campaignHub")
.build();
connection.start();
connection.on("UpdatedCampaignData", function(d) {
// Code omitted for clarity
});
当我在Visual Studio(2017 Enterprise)中运行时,此方法工作正常,但是当我将网站部署到测试服务器时,包含上述JavaScript的页面将永远不会收到通知。
我尝试添加示例中看到的常规“聊天室”代码,并且效果很好,因此SignalR在某种程度上可以正常工作。不仅如此,而且直接发送SignalR通知的页面之一(使用与上面所示相同的集线器方法)可以正常工作,因此似乎仅在计划的作业中存在问题。
注入正常,因为我没有任何空引用异常。
我真的不知道如何开始调试它。两种情况下运行的都是相同的代码,从日志记录中我可以看到已调度通知发送通知的作业中的行被调用,但是我不知道接下来会发生什么。我还没有找到任何方法来判断通知是否未发送,或者是否正在发送,但是目标页面没有接收到通知。
任何人都可以告诉我如何找出问题所在吗?抱歉,如果这里没有足够的信息,但我不知道还能告诉您什么。
谢谢
答案 0 :(得分:0)
我认为您缺少Invoke方法。以下是我的示例
(function () {
var connection = new signalR.HubConnectionBuilder().withUrl("/connectionHub").build();
connection.start().then(function () {
console.log("connected");
connection.invoke('getConnectionId')
.then(function (connectionId) {
sessionStorage.setItem('conectionId', connectionId);
// Send the connectionId to controller
}).catch(err => console.error(err.toString()));;
});
$("#sendmessage").click(function () {
var connectionId = sessionStorage.getItem('conectionId');
connection.invoke("Send", connectionId);
});
connection.on("ReceiveMessage", function (message) {
console.log(message);
});
})();
和中心代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.SignalR;
namespace SignalR.Models
{
public class ConnectionHub : Hub
{
public async Task Send(string userId)
{
var message = $"Send message to you with user id {userId}";
await Clients.Client(userId).SendAsync("ReceiveMessage", message);
}
public string GetConnectionId()
{
return Context.ConnectionId;
}
}
}
您可以阅读更多here