东道网站建设,如何找企业联系做网站,微信公众平台可以导入wordpress,网站服务器和空间的区别工作上有个业务#xff0c;.Net Core WebAPI作为服务端#xff0c;需要将运行过程中产生的日志分类#xff0c;并实时推送到各种终端进行报警#xff0c;终端有桌面(WPF)、移动(Xamarin.Forms)、网站(Angular.JS)等#xff0c;使用SignalR进行警报日志推送。微信公众号.Net Core WebAPI作为服务端需要将运行过程中产生的日志分类并实时推送到各种终端进行报警终端有桌面(WPF)、移动(Xamarin.Forms)、网站(Angular.JS)等使用SignalR进行警报日志推送。微信公众号Dotnet9网站Dotnet9问题或建议请网站留言 如果对您有所帮助欢迎赞赏。https://dotnet9.com阅读导航本文背景代码实现本文参考1.本文背景工作上有个业务.Net Core WebAPI作为服务端需要将运行过程中产生的日志分类并实时推送到各种终端进行报警终端有桌面(WPF)、移动(Xamarin.Forms)、网站(Angular.JS)等使用SignalR进行警报日志推送。下面是桌面端的测试效果 2.代码实现整个系统由服务端、桌面端、网站、移动端组成结构如下2.1 服务端与客户端都使用的日志实体类简单的日志定义服务端会主动将最新日志通过AlarmLogItem实例推送到各个终端/// summary
/// 报警日志
/// /summary
public class AlarmLogItem
{public string Id { get; set; }/// summary/// 日志类型/// /summarypublic AlarmLogType Type { get; set; }/// summary/// 日志名称/// /summarypublic string Text { get; set; }/// summary/// 日志详细信息/// /summarypublic string Description { get; set; }/// summary/// 日志更新时间/// /summarypublic string UpdateTime { get; set; }
}public enum AlarmLogType
{Info,Warn,Error
}2.2 服务端使用 .Net Core 2.2 搭建的Web API项目2.2.1 集线器类AlarmLogHub.cs定义集线器Hub类AlarmLogHub继承自Hub用于SignalR通信看下面的代码没加任何方法您没看错public class AlarmLogHub : Hub
{}2.2.2 Startup.cs需要在此类中注册SignalR管道及服务在下面两个关键方法中用到B/S后端的朋友非常熟悉了。ConfigureServices方法添加SignalR管道是这个说法吧services.AddSignalR(options { options.EnableDetailedErrors true; });Configure方法注册SignalR服务地址端口用的8022客户端访问地址是http://localhost:8022/alarmlogapp.UseSignalR(routes
{routes.MapHubAlarmLogHub(/alarmlog);
});2.2.3 SignalRTimedHostedService.cs这是个关键类用于服务端主动推送日志使用Baidu、Google好久才找到站长技术栈以C/S为主B/S做的不多没人指点心酸参考网址How do I push data from hub to client every second using SignalR 。该类继承自IHostedService作为服务自启动乱说的通过SignalRTimedHostedService 的构造函数依赖注入得到IHubContextAlarmLogHub的实例用于服务端向各客户端推送日志使用在StartAsync方法中开启定时器模拟服务端主动推送警报日志见 DoWork 方法internal class SignalRTimedHostedService : IHostedService, IDisposable
{private readonly IHubContextAlarmLogHub _hub;private Timer _timer;//模拟发送报警日志ListAlarmLogItem lstLogs new ListAlarmLogItem {new AlarmLogItem{ TypeAlarmLogType.Error,TextOK WebSocket断连,Description尝试连接50次未成功重连},new AlarmLogItem{ TypeAlarmLogType.Warn,TextOK WebSocket断开重连,Description尝试连接5次成功重连},new AlarmLogItem{ TypeAlarmLogType.Warn,TextOK Restfull断连,Description尝试连接30次成功重连},new AlarmLogItem{ TypeAlarmLogType.Error,TextOK WebSocket断连,Description第一次断开链接},new AlarmLogItem{ TypeAlarmLogType.Info,TextOK WebSocket连接成功,Description首次成功连接},new AlarmLogItem{ TypeAlarmLogType.Error,TextOK WebSocket断连,Description尝试连接第7次未成功重连}};Random rd new Random(DateTime.Now.Millisecond);public SignalRTimedHostedService(IHubContextAlarmLogHub hub){_hub hub;}public Task StartAsync(CancellationToken cancellationToken){_timer new Timer(DoWork, null, TimeSpan.Zero,TimeSpan.FromSeconds(1));return Task.CompletedTask;}private void DoWork(object state){if (DateTime.Now.Second % rd.Next(1, 3) 0){AlarmLogItem log lstLogs[rd.Next(lstLogs.Count)];log.UpdateTime DateTime.Now.ToString(yyyy-MM-dd HH:mm:ss.fff);_hub.Clients.All.SendAsync(ReceiveAlarmLog, log);}}public Task StopAsync(CancellationToken cancellationToken){_timer?.Change(Timeout.Infinite, 0);return Task.CompletedTask;}public void Dispose(){_timer?.Dispose();}
}SignalRTimedHostedService 类作为Host服务(继承自 IHostedService)需要在Startup.cs的ConfigureServices方法中注册管道(是吧各位有没有B/S比较好的书籍推荐站长打算有空好好学学)services.AddHostedServiceSignalRTimedHostedService();服务端关键代码已经全部奉上下面主要说说桌面端和移动端代码其实两者代码类似。2.3 网站参考 index.html2.4 桌面端(WPF)使用 .Net Core 3.0创建的WFP工程需要引入Nuget包Microsoft.AspNetCore.SignalR.Client界面用一个ListView展示收到的日志GridListBox x:NamemessagesList RenderTransformOrigin-0.304,0.109 BorderThickness1 BorderBrushGainsboro/
/Grid后台写的简陋直接在窗体构造函数中连接服务端SignalR地址http://localhost:8022/alarmlog 监听服务端警报日志推送ReceiveAlarmLog。using AppClient.Models;
using Microsoft.AspNetCore.SignalR.Client;
using System;
using System.Threading.Tasks;
using System.Windows;namespace SignalRChatClientCore
{/// summary/// Interaction logic for MainWindow.xaml/// /summarypublic partial class MainWindow : Window{HubConnection connection;public MainWindow(){InitializeComponent();connection new HubConnectionBuilder().WithUrl(http://localhost:8022/alarmlog).Build();connection.Closed async (error) {await Task.Delay(new Random().Next(0, 5) * 1000);await connection.StartAsync();};connection.OnAlarmLogItem(ReceiveAlarmLog, (message) {this.Dispatcher.Invoke(() {messagesList.Items.Add(message.Description);});});try{connection.StartAsync();messagesList.Items.Add(Connection started);}catch (Exception ex){messagesList.Items.Add(ex.Message);}}}
}2.4 移动端移动端其实和桌面端类似因为桌面端使用的 .Net Core 3.0移动端使用的 .NET Standard 2.0都需要引入Nuget包Microsoft.AspNetCore.SignalR.Client。界面使用ListView展示日志这就不贴代码了使用的MVVM方式直接贴ViewModel代码吧大家只看个大概不要纠结具体代码参照桌面.cs代码是不是一样的using AppClient.Models;
using AppClient.Views;
using Microsoft.AspNetCore.SignalR.Client;
using System;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Threading.Tasks;
using Xamarin.Forms;
using System.Linq;namespace AppClient.ViewModels
{/// summary/// 报警日志VM/// /summarypublic class AlarmItemsViewModel : BaseViewModel{private ViewState _state ViewState.Disconnected;/// summary/// 报警日志列表/// /summarypublic ObservableCollectionAlarmLogItem AlarmItems { get; set; }public Command LoadItemsCommand { get; set; }//连接报警服务端private HubConnection _connection;public AlarmItemsViewModel(){Title 报警日志;AlarmItems new ObservableCollectionAlarmLogItem();LoadItemsCommand new Command(async () await ExecuteLoadItemsCommand());//收到登录成功通知MessagingCenter.SubscribeLoginViewModel, LoginUser(this, LoginSuccess, async (sender, userInfo) {//DisplayAlert(登录成功, userInfo.UserName, 确定);});MessagingCenter.SubscribeNewItemPage, AlarmLogItem(this, 添加项, async (obj, item) {var newItem item as AlarmLogItem;AlarmItems.Add(newItem);await DataStore.AddItemAsync(newItem);});ConnectAlarmServer();}async Task ExecuteLoadItemsCommand(){if (IsBusy)return;IsBusy true;try{AlarmItems.Clear();var items await DataStore.GetItemsAsync(true);foreach (var item in items){AlarmItems.Add(item);}}catch (Exception ex){Debug.WriteLine(ex);}finally{IsBusy false;}}private async Task ConnectAlarmServer(){if (_state ViewState.Connected){try{await _connection.StopAsync();}catch (Exception ex){return;}_state ViewState.Disconnected;}else{try{_connection new HubConnectionBuilder().WithUrl(App.Setting.AlarmHost).Build();_connection.OnAlarmLogItem(ReceiveAlarmLog, async (newItem) {AlarmItems.Add(newItem);await DataStore.AddItemAsync(newItem);});_connection.Closed async (error) {await Task.Delay(new Random().Next(0, 5) * 1000);await _connection.StartAsync();};await _connection.StartAsync();}catch (Exception ex){return;}_state ViewState.Connected;}}private enum ViewState{Disconnected,Connecting,Connected,Disconnecting}}
}关键代码已经贴完了希望对大家能有所帮助。3.参考.NET 客户端 SignalR ASP.NET CoreSignalR-samplesHow do I push data from hub to client every second using SignalR除非注明文章均由 Dotnet9 整理发布欢迎转载。转载请注明本文地址https://dotnet9.com/6913.html欢迎扫描下方二维码关注 Dotnet9 的微信公众号本站会及时推送最新技术文章微信公众号“dotnet9_com”Dotnet9.com