96SEO 2026-02-19 08:52 14
服务项目调试时需要“附加到进程”开发体验比较差影响效率使用控制台不仅可以随时打断点调试还可以随时打印调试信息非常方便

app){//app.UseErrorPage();app.UseCors(CorsOptions.AllowAll);//
http://go.microsoft.com/fwlink/?LinkID316888//Hub
HubConfiguration());app.Map(/signalr,
true};//config.EnableCrossDomain
downmap.UseCors(CorsOptions.AllowAll).RunSignalR(config);});Make
reconnect.//GlobalHost.Configuration.ConnectionTimeout
connection.//GlobalHost.Configuration.DisconnectTimeout
value.//GlobalHost.Configuration.KeepAlive
programmaticallyGlobalHost.TraceManager.Switch.Level
}建立可在服务里运行的服务类使用了上面的Startup配置实例化宿主对象里面定义了服务的启动暂停关闭等触发时的一些动作本文就建立一个
System.Threading.Tasks;namespace
$http://{JsonConfig.Instance.Root()?.Debug?.Ip}:{JsonConfig.Instance.Root()?.Debug?.Port};var
${JsonConfig.Instance.Root()?.Debug?.Port};
$http://{JsonConfig.Instance.Root()?.Release?.Ip}:{JsonConfig.Instance.Root()?.Release?.Port};var
${JsonConfig.Instance.Root()?.Release?.Port};
StartOptions();options.Urls.Add(url);options.Urls.Add($http://:{Port});//此处需要用一个全局变量来保存WebApp,否则在发布为后台服务的时候生命周期会提前结束,被系统回收掉SignalR
WebApp.StartStartup(options);Task.Delay(TimeSpan.FromSeconds(1)).Wait();Console.WriteLine(Server
url);Console.WriteLine(${displayName}服务开始);Console.ReadLine();LogHelper.GetInstance().Information(${displayName}服务开始,地址
ex){LogHelper.GetInstance().Error(ex);}return
Stop(){SignalR.Dispose();LogHelper.GetInstance().Information(${displayName}服务停止);System.Threading.Thread.Sleep(1500);return
Shutdown(){SignalR.Dispose();LogHelper.GetInstance().Information(${displayName}服务停止);System.Threading.Thread.Sleep(1500);return
HenryMes.SignalR.Hosting;static
tc.Shutdown());s.WhenStopped(tc
tc.Stop());});x.RunAsLocalSystem();x.StartAutomatically();x.SetDescription(displayName);x.SetDisplayName(displayName);x.SetServiceName(displayName);});}}
的连接和断开一个线程管理一个连接连接断开线程自动取消建立一个抽象类
System.Threading.Tasks;namespace
/summary[HubName(nameof(T))]public
OnConnected(){//获取客户端IDConsole.WriteLine({0}已连接,
Context.ConnectionId);LogHelper.GetInstance().Information($服务端与客户端【{typeof(T).Name}】{Context.ConnectionId}
OnReconnected(){Console.WriteLine({0}已重连,
Context.ConnectionId);LogHelper.GetInstance().Information($服务端与客户端【{typeof(T).Name}】{Context.ConnectionId}
已重连);Send(Context.ConnectionId);return
IsCompletedAllTasks(CancellationTokenSource
ex){LogHelper.GetInstance().Error($系统错误:{this.GetType().Name},{ex.Flatten().InnerException.Message});tokenSource.Cancel();}return
CancellationTokenSource();Connections.TryAdd(connectId,
(!tokenSource.Token.IsCancellationRequested){try{//
正在回传数据!;LogHelper.GetInstance().Information(message);//
把组装好的数据推送到前端BaseNotiferT.Refresh(connectId,
JsonConvert.SerializeObject(result));tokenSource.Token.WaitHandle.WaitOne(intervalTime);}else{//
RunMultiTaskMethod(tokenSource);if
正在回传数据!;LogHelper.GetInstance().Information(message);//
把组装好的数据推送到前端BaseNotiferT.Refresh(connectId,
JsonConvert.SerializeObject(result));//
下一次推送等待N秒后进行tokenSource.Token.WaitHandle.WaitOne(intervalTime);}else{//
打印超时错误日志LogHelper.GetInstance().Error(${this.GetType().Name}
当前超时时间设置为{millisecondsTimeout}毫秒!);//
重新执行Connections.TryRemove(connectId,
tokenSource);Send(connectId);}}}catch(AggregateException
ex){LogHelper.GetInstance().Error($系统错误:{this.GetType().Name},{ex.Flatten().InnerException.Message});tokenSource.Token.WaitHandle.WaitOne(intervalTime);}}},
Connections[Context.ConnectionId];Connections.TryRemove(Context.ConnectionId,
tokenSource);tokenSource.Cancel();LogHelper.GetInstance().Information($服务端与客户端【{typeof(T).Name}】{Context.ConnectionId}
(Connections.ContainsKey(Context.ConnectionId)){var
Connections[Context.ConnectionId];Connections.TryRemove(Context.ConnectionId,
打印错误日志LogHelper.GetInstance().Error(${this.GetType().Name}
base.OnDisconnected(stopCalled);}}
HenryMes.WebApi.Controllers.O***r;
System.Threading.Tasks;namespace
controller.ControlCenter_Center_Sum4Rapeseed();return
controller.ControlCenter_Center_Sum4Oil();return
controller.ControlCenter_Center_Sum4Top();return
controller.ControlCenter_Center_SaleDispatch4Month();return
controller.ControlCenter_Center_PreInStore4Lately();return
ProductionTaskController();dynamic
ListSqlSugar.ConditionalModel()});return
data.Content;});#endregion#region
IsCompletedAllTasks(TokenSource,
{taskSum4Rapeseed,taskSum4Oil,taskSum4Top,taskTankOilQuantity,taskSaleDispatch4Month,taskPreInStore4Lately,taskProductionTask});#endregionif
RapeseedResult?.Data?.Rapeseed_GYS?.PurchaseReceiveQuantity,BalanceQuantity
RapeseedResult?.Data?.Rapeseed_GYS?.BalanceQuantity,},SD
RapeseedResult?.Data?.Rapeseed_SD?.PurchaseReceiveQuantity,BalanceQuantity
RapeseedResult?.Data?.Rapeseed_SD?.BalanceQuantity,}};//
Sum4OilResult?.Data?.TankOil?.ProductReceiveQuantity,//
Sum4OilResult?.Data?.PackageOil?.ProductReceiveQuantity,//
Sum4OilResult?.Data?.PackageOil?.SaleDispatchQuantity};//
new{Sum4TopResult?.Data?.DataSource};//
taskSaleDispatch4Month.Result;var
TaskSaleDispatch4MonthResult?.Data?.SaleDispatch.Details,Product
TaskSaleDispatch4MonthResult?.Data?.ProductReceive.Details};//
taskPreInStore4Lately.Result;var
TaskPreInStore4LatelyResult?.Data?.DataSource;//
taskProductionTaskResult?.Data;return
new{Rapeseed,Sum4Oil,Sum4Top,TankOilQuantity,SaleDispatch4Month,PreInStore4Lately,ProductionTask});#endregion}return
的后台推送基本就完成了再来就是web前端的接收推送和断线下的自动重新连接比如说后台服务程序做了更新此时需要关闭服务再启动服务这个时候要求web端不断尝试重新连接直到后台服务启动并重新连接上为止
../../pages/kanban/OperationKanBanEcharts.vue;
是否需要断线重连的标记当页面关闭时是不需要继续推送的tryReconnect
从SignalR推送过来的数据刷新看板refreshKanban(message)
$.hubConnection(process.env.SignalR);//
定义服务器端SignalR推送过来的消息接收代理this.proxy
this.connection.createHubProxy(OperationKanBanHub);this.proxy.on(Refresh,
的数据!)this.refreshKanban(message)});//
创建连接到服务器端SignalR的连接this.connection.start().done(()
客户端发送信息到服务器this.proxy.invoke(Send,
this.connection.id);}).fail((err)
{console.log(err);});this.connection.disconnected(()
{console.log(连接已断开,正尝试重新连接!)this.connection.start().done(()
清除缓存this.$vnode.parent.componentInstance.cache
{};this.$vnode.parent.componentInstance.keys
};最后的一个步骤怎么把后台的控制台SignalR宿主程序安装成
ansi不要问我为什么......因为不改的话打开批处理命令窗口的时候中文会显示成乱码
vbscript:CreateObject(Shell.Application).ShellExecute(cmd.exe,/c
vbscript:CreateObject(Shell.Application).ShellExecute(cmd.exe,/c
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback