Blazor集成Serilog时出现ConnectionStrings重复键ArgumentException异常的解决方案咨询
解决Serilog添加后Startup重复调用导致的ConnectionStrings键重复异常
这个问题的核心是你修改代码时删掉了原有ConfigureWebHostDefaults中的关键逻辑,并且没有正确整合Serilog的配置顺序,导致Startup被重复注册,进而触发配置键重复的异常。下面是具体的解决方法,完全保留你的原有逻辑并成功添加Serilog功能:
正确的配置代码
你需要在Host.CreateDefaultBuilder之后链式添加UseSerilog,同时完整保留原来ConfigureWebHostDefaults中的所有代码(包括RELEASE环境下的特殊配置),确保UseStartup<Startup>()只被调用一次:
Host.CreateDefaultBuilder(args) // 添加Serilog配置,这里可以自定义日志写入规则 .UseSerilog((hostContext, loggerConfiguration) => { loggerConfiguration // 从应用配置文件读取Serilog设置(推荐) .ReadFrom.Configuration(hostContext.Configuration) // 配置日志写入后端文件,可根据需求调整参数 .WriteTo.File( path: "logs/app-.txt", rollingInterval: RollingInterval.Day, retainedFileCountLimit: 10, outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}" ); }) // 完整保留原有WebHost配置逻辑 .ConfigureWebHostDefaults(webBuilder => { #if RELEASE webBuilder.UseContentRoot(Directory.GetCurrentDirectory()); webBuilder.UseIISIntegration(); #endif webBuilder.UseStartup<Startup>(); });
为什么你的原有修改会出问题?
你之前的修改直接替换了ConfigureWebHostDefaults的内容,删掉了RELEASE环境下的配置,并且没有正确关联Serilog与宿主配置上下文。这种情况下,宿主初始化时可能会重复加载配置源或者重复注册Startup,导致ConnectionStrings等配置键被重复添加,触发ArgumentException。
额外配置建议
为了让Serilog的配置更灵活,建议在appsettings.json中添加Serilog的配置节点(可以覆盖代码中的硬编码设置):
"Serilog": { "MinimumLevel": { "Default": "Information", "Override": { "Microsoft": "Warning", "Microsoft.AspNetCore": "Warning", "System": "Warning" } }, "WriteTo": [ { "Name": "File", "Args": { "path": "logs/app-.txt", "rollingInterval": "Day", "retainedFileCountLimit": 10, "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}" } } ] }
这样调整后,既保留了你原有服务器端的所有逻辑,又成功将Blazor WASM客户端的日志通过Serilog写入后端文件,同时避免了配置键重复的异常。
内容的提问来源于stack exchange,提问作者Frank Mehlhop
相关产品推荐
相关产品推荐

