.NET Core 7.0配置Swagger遇资源获取错误及NLog异常求助
解决方案:Swagger资源获取错误与NLog异常修复
一、Swagger "Fetch error NetworkError" 问题修复
1. 调整中间件顺序
确保Swagger相关中间件未被路由、授权中间件拦截,正确的中间件顺序示例:
if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseSwagger(); app.UseSwaggerUI(options => { options.SwaggerEndpoint("/swagger/v1/swagger.json", "v1"); options.RoutePrefix = string.Empty; }); } app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
2. 标记控制器核心属性
所有API控制器必须添加[ApiController]属性,该属性是Swagger识别自定义路由API的关键:
[ApiController] [Route("custom/[controller]")] // 自定义路由示例 public class TodoController : ControllerBase { // Action方法实现 }
3. 配置XML注释生成完整文档
自定义路由的API需要XML注释辅助Swagger生成正确的swagger.json:
- 右键项目 → 属性 → 生成 → 勾选"XML文档文件",复制生成路径。
- 在
AddSwaggerGen中添加注释配置:
using System.Reflection; services.AddSwaggerGen(options => { options.SwaggerDoc("v1", new OpenApiInfo { Version = "v1", Title = "ToDo API", Description = "An ASP.NET Core Web API for managing ToDo items", TermsOfService = new Uri("https://example.com/terms"), Contact = new OpenApiContact { Name = "Example Contact", Url = new Uri("https://example.com/contact") }, License = new OpenApiLicense { Name = "Example License", Url = new Uri("https://example.com/license") } }); // 加载XML注释文件 var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); options.IncludeXmlComments(xmlPath); });
4. 验证swagger.json可用性
直接在浏览器访问/swagger/v1/swagger.json:
- 若返回404:检查是否存在全局路由前缀(如
app.UsePathBase("/api")),需将SwaggerEndpoint改为"/api/swagger/v1/swagger.json"。 - 若返回JSON但包含错误:根据错误信息排查路由模板冲突或控制器配置问题。
二、NLog "aspnet-request-statuscode" 异常修复
1. 确认NuGet包版本适配
安装适配.NET Core 7的NLog.Web.AspNetCore包(版本≥5.0),可通过命令行安装:
Install-Package NLog.Web.AspNetCore -Version 5.2.3
2. 修正nlog.config配置
确保<extensions>节点位于<nlog>根节点下,且布局渲染器拼写正确:
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <extensions> <add assembly="NLog.Web.AspNetCore"/> </extensions> <!-- 示例文件输出配置 --> <targets> <target name="file" xsi:type="File" fileName="logs/${shortdate}.log" layout="${longdate} ${level} ${aspnet-request-statuscode} ${message} ${exception:format=ToString}"/> </targets> <rules> <logger name="*" minlevel="Debug" writeTo="file"/> </rules> </nlog>
注意布局渲染器名称为${aspnet-request-statuscode},需包含$符号,避免拼写错误。
3. 正确注册NLog到应用宿主
在Program.cs中完成NLog的初始化与注册:
var logger = NLog.LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger(); try { logger.Debug("启动应用"); var builder = WebApplication.CreateBuilder(args); // 清除默认日志提供器,注册NLog builder.Logging.ClearProviders(); builder.Host.UseNLog(); // 其他服务配置 builder.Services.AddControllers(); // ... var app = builder.Build(); // 中间件配置... app.Run(); } catch (Exception ex) { logger.Error(ex, "应用启动失败"); throw; } finally { NLog.LogManager.Shutdown(); }
4. 清理并重新生成项目
删除bin和obj目录,重新生成解决方案,确保NuGet包引用和配置文件生效。
内容的提问来源于stack exchange,提问作者Shahroz
相关产品推荐
相关产品推荐

