using Infrastructure.Extensions; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Linq; using System.Net.Http; using System.Threading; using System.Threading.Tasks; namespace IoT.Shared.Infrastructure { public abstract class DeviceService : IHostedService { internal readonly IServiceProvider _applicationServices; internal readonly IConfiguration _configuration; public DeviceService(IServiceProvider applicationServices, IConfiguration configuration) { this._applicationServices = applicationServices; this._configuration = configuration; } public virtual Task StartAsync(CancellationToken cancellationToken) { Task.Run(async () => { while (!cancellationToken.IsCancellationRequested) { try { Execute(); } catch (Exception ex) { ex.PrintStack(); } await Task.Delay(_configuration.GetValue("timer.seconds", 60) * 1000).ConfigureAwait(true); } }); return Task.CompletedTask; } public abstract void Execute(); public virtual Task StopAsync(CancellationToken cancellationToken) { return Task.CompletedTask; } [System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1031:不捕获常规异常类型", Justification = "<挂起>")] public string GetApiJson(string prefix) { try { using var scope = _applicationServices.CreateScope(); var serviceProvider = scope.ServiceProvider; var cfg = serviceProvider.GetService(); var port = cfg["server.urls"].Split(':')[2]; var url = $"http://localhost:{port}/swagger/v1/swagger.json"; var hc = serviceProvider.GetService().CreateClient(); var result = hc.GetStringAsync(url).Result; var json = JsonConvert.DeserializeObject(result) as JObject; var paths = json.Properties().FirstOrDefault(o => o.Name == "paths").Value as JObject; var names = paths.Properties().Select(o => o.Name).ToList(); foreach (var item in names) { if (!item.StartsWith(prefix)) { paths.Remove(item); } } var realResult = JsonConvert.SerializeObject(json); return realResult; } catch (Exception ex) { ex.PrintStack(); return null; } } public void SendToServer(string method, object data) { Console.WriteLine("send device to server"); using var scope = _applicationServices.CreateScope(); var clientService = scope.ServiceProvider.GetService(); clientService.SendToServer(method, data); } } }