无法发送保存在数据库中的实时通知
Unable to send real-time notifications saved in database
我正在使用 ASP.NET 样板模板并尝试为特定用户获取基于实体的实时通知。我的通知在 Abp.TenantNotifications
table 中成功发布,订阅在 Abp.NotificationSubscriptions
table 中成功保存。但是我无法让它在客户端显示。
我已经根据 the documentation.
将我的项目与 SignalR 集成
我发布通知的应用服务:
public async Task PublishCreated(Guid WorkOrderId, long UserId)
{
var user = await UserManager.GetUserByIdAsync(UserId);
var workorder = await _workOrderDirectoryRepository.GetAsync(WorkOrderId);
await _notiticationPublisher.PublishAsync(
notificationName: "WorkOrder",
data: new MessageNotificationData("New WO is " + workorder.WorkOrderStatus + " with code " + workorder.WorkOrderCode),
entityIdentifier: new EntityIdentifier(typeof(WorkOrderDirectory), workorder.Id),
severity: NotificationSeverity.Success,
userIds: new[] { user.ToUserIdentifier() }
);
await _notificationSubscriptionManager.SubscribeAsync(user.ToUserIdentifier(), "WorkOrder");
await _backgroundJobManager.EnqueueAsync<WONotificationJob, UserIdentifier>(
user.ToUserIdentifier(),
delay: TimeSpan.FromSeconds(5)
);
}
后台作业:
public class WONotificationJob : BackgroundJob<UserIdentifier>, ITransientDependency
{
private readonly IRealTimeNotifier _realTimeNotifier;
private readonly IUserNotificationManager _userNotificationManager;
public WONotificationJob(
IRealTimeNotifier realTimeNotifier,
IUserNotificationManager userNotificationManager)
{
_realTimeNotifier = realTimeNotifier;
_userNotificationManager = userNotificationManager;
}
[UnitOfWork]
public override void Execute(UserIdentifier args)
{
var notifications = _userNotificationManager.GetUserNotifications(args);
AsyncHelper.RunSync(() => _realTimeNotifier.SendNotificationsAsync(notifications.ToArray()));
}
}
客户端代码:
function loadWorkOrderDirectories() {
workOrderDirectoryService.getList().success(function(result) {
$scope.workOrderDirectories = result.items;
publishNotifications($scope.workOrderDirectories);
showUInotifications();
});
};
loadWorkOrderDirectories();
function publishNotifications(arr) {
angular.forEach(arr, function(value, key) {
workOrderDirectoryService.publishCreated(value.id, 2);
});
};
function showUInotifications() {
abp.event.on('abp.notifications.received', function(userNotification) {
abp.notifications.showUiNotifyForUserNotification(userNotification);
$scope.notis = userNotification;
if (userNotification.notification.data.type === 'Abp.Notifications.LocalizableMessageNotificationData') {
var localizedText = abp.localization.localize(
userNotification.notification.data.message.name,
userNotification.notification.data.message.sourceName
);
$.each(userNotification.notification.data.properties, function(key, value) {
localizedText = localizedText.replace('{' + key + '}', value);
});
alert('New localized notification: ' + localizedText);
} else if (userNotification.notification.data.type === 'Abp.Notifications.MessageNotificationData') {
alert('New simple notification: ' + userNotification.notification.data.message);
}
});
};
_realTimeNotifier._onlineClientManager.Clients
为空。这是我得到的:https://ibb.co/0qmqFfN
请帮助我。提前谢谢你。
在 layout.cshtml.
中为 jquery.signalR-2.4.0.js
添加脚本标签
<!--SIGNAL R-->
<script src="~/Scripts/jquery.signalR-2.4.0.js"></script> <!-- Add this -->
<script src="~/signalr/hubs"></script>
<script src="~/Abp/Framework/scripts/libs/abp.signalr.js"></script>
将app.MapSignalR();
移动到Configuration
的末尾,认证后,在Startup.cs.
public void Configuration(IAppBuilder app)
{
// app.MapSignalR(); // Move this...
// ...
app.MapSignalR(); // ...here!
}
我正在使用 ASP.NET 样板模板并尝试为特定用户获取基于实体的实时通知。我的通知在 Abp.TenantNotifications
table 中成功发布,订阅在 Abp.NotificationSubscriptions
table 中成功保存。但是我无法让它在客户端显示。
我已经根据 the documentation.
将我的项目与 SignalR 集成我发布通知的应用服务:
public async Task PublishCreated(Guid WorkOrderId, long UserId)
{
var user = await UserManager.GetUserByIdAsync(UserId);
var workorder = await _workOrderDirectoryRepository.GetAsync(WorkOrderId);
await _notiticationPublisher.PublishAsync(
notificationName: "WorkOrder",
data: new MessageNotificationData("New WO is " + workorder.WorkOrderStatus + " with code " + workorder.WorkOrderCode),
entityIdentifier: new EntityIdentifier(typeof(WorkOrderDirectory), workorder.Id),
severity: NotificationSeverity.Success,
userIds: new[] { user.ToUserIdentifier() }
);
await _notificationSubscriptionManager.SubscribeAsync(user.ToUserIdentifier(), "WorkOrder");
await _backgroundJobManager.EnqueueAsync<WONotificationJob, UserIdentifier>(
user.ToUserIdentifier(),
delay: TimeSpan.FromSeconds(5)
);
}
后台作业:
public class WONotificationJob : BackgroundJob<UserIdentifier>, ITransientDependency
{
private readonly IRealTimeNotifier _realTimeNotifier;
private readonly IUserNotificationManager _userNotificationManager;
public WONotificationJob(
IRealTimeNotifier realTimeNotifier,
IUserNotificationManager userNotificationManager)
{
_realTimeNotifier = realTimeNotifier;
_userNotificationManager = userNotificationManager;
}
[UnitOfWork]
public override void Execute(UserIdentifier args)
{
var notifications = _userNotificationManager.GetUserNotifications(args);
AsyncHelper.RunSync(() => _realTimeNotifier.SendNotificationsAsync(notifications.ToArray()));
}
}
客户端代码:
function loadWorkOrderDirectories() {
workOrderDirectoryService.getList().success(function(result) {
$scope.workOrderDirectories = result.items;
publishNotifications($scope.workOrderDirectories);
showUInotifications();
});
};
loadWorkOrderDirectories();
function publishNotifications(arr) {
angular.forEach(arr, function(value, key) {
workOrderDirectoryService.publishCreated(value.id, 2);
});
};
function showUInotifications() {
abp.event.on('abp.notifications.received', function(userNotification) {
abp.notifications.showUiNotifyForUserNotification(userNotification);
$scope.notis = userNotification;
if (userNotification.notification.data.type === 'Abp.Notifications.LocalizableMessageNotificationData') {
var localizedText = abp.localization.localize(
userNotification.notification.data.message.name,
userNotification.notification.data.message.sourceName
);
$.each(userNotification.notification.data.properties, function(key, value) {
localizedText = localizedText.replace('{' + key + '}', value);
});
alert('New localized notification: ' + localizedText);
} else if (userNotification.notification.data.type === 'Abp.Notifications.MessageNotificationData') {
alert('New simple notification: ' + userNotification.notification.data.message);
}
});
};
_realTimeNotifier._onlineClientManager.Clients
为空。这是我得到的:https://ibb.co/0qmqFfN
请帮助我。提前谢谢你。
在 layout.cshtml.
中为jquery.signalR-2.4.0.js
添加脚本标签<!--SIGNAL R--> <script src="~/Scripts/jquery.signalR-2.4.0.js"></script> <!-- Add this --> <script src="~/signalr/hubs"></script> <script src="~/Abp/Framework/scripts/libs/abp.signalr.js"></script>
将
app.MapSignalR();
移动到Configuration
的末尾,认证后,在Startup.cs.public void Configuration(IAppBuilder app) { // app.MapSignalR(); // Move this... // ... app.MapSignalR(); // ...here! }