using Blazored.LocalStorage;
using EasyTemplate.Blazor.Web.Components;
using EasyTemplate.Page.Common;
using EasyTemplate.Service.Common;
using EasyTemplate.Tool;
using EasyTemplate.Tool.Util;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc.ApplicationModels;
using Microsoft.AspNetCore.StaticFiles;
using Microsoft.Extensions.FileProviders;
using Microsoft.OpenApi.Models;
using System.Net;
using System.Net.Sockets;
using System.Reflection;
using System.Text;
using EasyTemplate.Service;
namespace EasyTemplate.Blazor.Web.Common;
public static class TheRegister
{
///
/// 注册配置
///
///
///
public static WebApplicationBuilder? RegistService(this WebApplicationBuilder? builder)
{
var configuration = builder.Configuration;
// Add services to the container.
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
builder.Services.AddConfiguration();
builder.Services.AddLocalLog();
builder.Services.AddSqlSugar();
builder.Services.AddRedis();
builder.Services.AddAntDesign();
builder.Services.AddInteractiveStringLocalizer();
builder.Services.AddLocalization();
builder.Services.AddHttpContextAccessor();
// 在Program.cs中添加更详细的错误处理
builder.Services.Configure(options =>
{
options.AllowSynchronousIO = true;
});
builder.Services.AddCors(options =>
{
options.AddPolicy("Policy", policy =>
{
policy.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
});
});
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = "/account/login"; // 登录页路径
options.AccessDeniedPath = "/error/404"; // 未授权页路径
options.SlidingExpiration = true; // 滑动过期
});
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
builder.Services.AddAuthorization();
builder.Services.Configure(Setting.GetSection("ThemeSettings"));
Global.SystemName = Setting.Get("ThemeSettings:Title");
builder.Services.AddControllers().AddNewtonsoftJson();//不加该注册,api传参易报错
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(options =>
{
typeof(ApiGroupNames).GetFields().Skip(1).ToList().ForEach(f =>
{
//获取枚举值上的特性
var info = f.GetCustomAttributes(typeof(GroupInfoAttribute), false).OfType().FirstOrDefault();
options.SwaggerDoc(f.Name, new Microsoft.OpenApi.Models.OpenApiInfo
{
Title = info?.Title,
Version = info?.Version,
Description = info?.Description
});
});
options.SwaggerDoc("all", new Microsoft.OpenApi.Models.OpenApiInfo
{
Title = "全部"
});
options.DocInclusionPredicate((docName, apiDescription) =>
{
if (docName != "all")
{
return apiDescription.GroupName == docName;
}
return true;
});
options.AddSecurityDefinition("Bearer", new Microsoft.OpenApi.Models.OpenApiSecurityScheme()
{
Description = "请输入正确的Token格式:Bearer token",
Name = "Authorization",
In = Microsoft.OpenApi.Models.ParameterLocation.Header,
Type = Microsoft.OpenApi.Models.SecuritySchemeType.ApiKey,
BearerFormat = "JWT",
Scheme = "Bearer"
});
//options.DocInclusionPredicate((docName, description) => true);
options.AddSecurityRequirement(new Microsoft.OpenApi.Models.OpenApiSecurityRequirement() {
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference()
{
Type = ReferenceType.SecurityScheme,
Id = "Bearer"
}
},
new string[]{ }
}
});
var baseDirectory = System.AppDomain.CurrentDomain.BaseDirectory;
var xmlFile = System.AppDomain.CurrentDomain.FriendlyName + ".xml";
var xmlPath = Path.Combine(baseDirectory, xmlFile);
options.IncludeXmlComments(xmlPath);
});
//将类库中razor注册到应用中
builder.Services.AddAssembly();
builder.Services.AddDynamicController();
builder.Services.AddSignalR();
builder.Services.AddSignalR(options =>
{
options.MaximumReceiveMessageSize = 102400; // 100KB
options.EnableDetailedErrors = true;
});
//builder.Services.AddCascadingAuthenticationState();
//builder.Services.AddScoped();
builder.Services.AddScoped();
builder.Services.AddScoped(implementationFactory => implementationFactory.GetRequiredService());
// 注册 Blazored.LocalStorage 服务
builder.Services.AddBlazoredLocalStorage();
builder.Services.AddSingleton();
//builder.Services.AddSingleton();
// 在 Startup.cs 或 Program.cs 中注册
//builder.Services.AddScoped();
// builder.Services.AddHostedService();
// 注册后台UDP监听服务
//builder.Services.AddSingleton();
//builder.Services.AddHostedService(sp => sp.GetRequiredService());
//for (int i = 0; i < 40; i++)
//{
// NozzleState ns = new NozzleState();
// ns.noz = i + 1;
// ns.warnstate = i % 3;
// ns.oil = i % 2 == 0 ? "92#" : "95#";
// GlobalTool.g_mNozzleState.Add(ns.noz, ns);
//}
builder.Services.AddHostedService();
builder.Services.AddHostedService();
builder.Services.AddSingleton();
builder.Services.BuildServiceProvider().GetService();
// builder.Services.AddSingleton();
builder.Services.AddScoped();
builder.Services.AddScoped();
//builder.Services.AddHostedService();
//builder.Services.AddScoped(provider =>
// provider.GetRequiredService());
// 注册UDP服务
//builder.Services.AddScoped();
//builder.Services.AddScoped();
/*
UdpClient udpServer = new UdpClient(10000);
IPEndPoint clientEndPoint = new IPEndPoint(IPAddress.Any, 0);
Console.WriteLine("UDP Server started on port 10000...");
while (true)
{
try
{
byte[] receiveBytes = udpServer.Receive(ref clientEndPoint);
string receivedData = Encoding.UTF8.GetString(receiveBytes);
Console.WriteLine($"Received: {receivedData} from {clientEndPoint}");
string response = "Echo: " + receivedData;
byte[] sendBytes = Encoding.UTF8.GetBytes(response);
udpServer.Send(sendBytes, sendBytes.Length, clientEndPoint);
}
catch (Exception e)
{
Console.WriteLine("Error: " + e.Message);
}
}
*/
return builder;
}
///
/// 注册应用
///
///
///
public static WebApplicationBuilder? RegistApp(this WebApplicationBuilder? builder)
{
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error", createScopeForErrors: true);
}
app.UseStatusCodePagesWithReExecute("/error/{0}");
app.UseSwagger();
app.UseSwaggerUI(options =>
{
//遍历ApiGroupNames所有枚举值生成接口文档,Skip(1)是因为Enum第一个FieldInfo是内置的一个Int值
typeof(ApiGroupNames).GetFields().Skip(1).ToList().ForEach(f =>
{
//获取枚举值上的特性
var info = f.GetCustomAttributes(typeof(GroupInfoAttribute), false).OfType().FirstOrDefault();
options.SwaggerEndpoint($"/swagger/{f.Name}/swagger.json", info != null ? info.Title : f.Name);
});
options.SwaggerEndpoint("/swagger/all/swagger.json", "全部");
});
app.UseStaticFiles();
app.UseCors("Policy");
app.UseDynamicWebApi();
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseAntiforgery();
app.MapRazorComponents()
.AddInteractiveServerRenderMode();
app.MapControllers();
//UdpServer server = new UdpServer(); // 创建UdpServer实例并启动监听线程
//Console.WriteLine("UDP Server is running...");
// Console.ReadLine(); // 等待用户输入以保持程序运行,以便可以看到输出结果。实际应用中可以根据需要调整。
// server.StopServer(); // 在需要停止服务器时调用此方法,例如在程序结束时。
using (var scope = app.Services.CreateScope())
{
var myService = scope.ServiceProvider.GetRequiredService();
// 初始化数据库中的油枪状态
InitializeNozzleStates(scope.ServiceProvider);
}
app.Run();
return builder;
}
///
/// 从数据库查询所有油枪并初始化状态
///
private static void InitializeNozzleStates(IServiceProvider serviceProvider)
{
try
{
var nozzleService = serviceProvider.GetRequiredService();
// 异步获取油枪数据
var task = Task.Run(async () => await nozzleService.GetNozzlesAsync());
var nozzles = task.Result;
if (nozzles != null && nozzles.Count > 0)
{
foreach (var nozzle in nozzles)
{
if (!GlobalTool.g_mNozzleState.ContainsKey(nozzle.NozzleId))
{
var nozzleState = new NozzleState
{
noz = nozzle.NozzleId,
VLR = "0",
oil = nozzle.product.ToString()+"#", // 可以根据需要设置默认油品
nozzlestate = GlobalTool.NozzleState_Offline, // 初始状态设为离线
warnstate = GlobalTool.WarningState_Normal // 初始警告状态设为正常
};
GlobalTool.g_mNozzleState.Add(nozzle.NozzleId, nozzleState);
}
}
Console.WriteLine($"已初始化 {nozzles.Count} 个油枪状态");
}
else
{
Console.WriteLine("数据库中没有找到油枪数据");
}
}
catch (Exception ex)
{
Console.WriteLine($"初始化油枪状态时发生错误:{ex.Message}");
}
}
private static FileExtensionContentTypeProvider GetFileExtensionContentTypeProvider()
{
var provider = new FileExtensionContentTypeProvider();
provider.Mappings[".iec"] = "application/octet-stream";
provider.Mappings[".patch"] = "application/octet-stream";
provider.Mappings[".apk"] = "application/vnd.android.package-archive";
provider.Mappings[".pem"] = "application/x-x509-user-cert";
provider.Mappings[".gzip"] = "application/x-gzip";
provider.Mappings[".7zip"] = "application/zip";
provider.Mappings[".jpg2"] = "image/jp2";
provider.Mappings[".et"] = "application/kset";
provider.Mappings[".dps"] = "application/ksdps";
provider.Mappings[".cdr"] = "application/x-coreldraw";
provider.Mappings[".shtml"] = "text/html";
provider.Mappings[".php"] = "application/x-httpd-php";
provider.Mappings[".php3"] = "application/x-httpd-php";
provider.Mappings[".php4"] = "application/x-httpd-php";
provider.Mappings[".phtml"] = "application/x-httpd-php";
provider.Mappings[".pcd"] = "image/x-photo-cd";
provider.Mappings[".bcmap"] = "application/octet-stream";
provider.Mappings[".properties"] = "application/octet-stream";
provider.Mappings[".m3u8"] = "application/x-mpegURL";
return provider;
}
}
internal class ServiceLocalSelectController : ISelectController
{
public bool IsController(Type type)
{
return type.IsPublic && type.GetCustomAttribute() != null;
}
}
internal class ServiceActionRouteFactory : IActionRouteFactory
{
public string CreateActionRouteModel(string areaName, string controllerName, ActionModel action)
{
var controllerType = action.ActionMethod.DeclaringType;
var serviceAttribute = controllerType.GetCustomAttribute();
var _controllerName = serviceAttribute.ServiceName == string.Empty ? controllerName.Replace("Service", "") : serviceAttribute.ServiceName.Replace("Service", "");
return $"api/{_controllerName.Replace("Service", "")}/{action.ActionName.Replace("Async", "")}";
}
}