ASP.NET Core 6 Web API部署IIS后Swagger解析错误解决
解决ASP.NET Core 6 Web API部署IIS后Swagger解析错误问题
我开发的ASP.NET Core 6 Web API在本地运行正常,但部署至IIS后访问Swagger时,出现错误提示:“Parser error on line 13 end of the stream or a document separator is expected”。注意:我的Program.cs第13行并无特殊内容,请问该如何解决?
排查与解决方案
修正SwaggerEndpoint路径配置
你当前配置的SwaggerEndpoint使用了相对路径../swagger/v1/swagger.json,部署到IIS后,若应用处于虚拟目录下,相对路径会导致Swagger UI无法正确找到swagger.json文件。建议改为绝对路径:c.SwaggerEndpoint("/swagger/v1/swagger.json", "My-APP API");如果应用部署在IIS的虚拟目录(如
/MyApp),则路径需调整为/MyApp/swagger/v1/swagger.json,确保路径层级匹配站点实际部署结构。检查IIS基础配置
- 确认应用池的
.NET CLR版本设置为无托管代码,.NET Core版本选择6.0。 - 验证站点物理路径指向Web API发布后的根目录(自包含部署)或
wwwroot目录(框架依赖部署)。 - 确保服务器已安装ASP.NET Core Hosting Bundle,缺少该组件会导致ASP.NET Core应用无法在IIS中正常运行。
- 确认应用池的
验证swagger.json生成状态
直接访问http://你的站点域名/swagger/v1/swagger.json,检查是否能返回完整的JSON内容:- 若返回空白、错误页面或非JSON数据,说明Swagger生成过程存在异常,可通过Serilog日志排查控制器/模型的序列化问题(比如未处理的特殊类型、隐藏的循环引用)。
- 若访问该URL时出现404,需确认Swagger服务在生产环境是否被正确启用(默认情况下ASP.NET Core会在非开发环境禁用Swagger,若需开启需手动配置环境判断)。
清理并重新发布应用
- 本地执行
清理解决方案→重新生成操作,避免编译缓存导致的问题。 - 重新发布应用到IIS,覆盖旧文件,确保发布配置包含所有必要的依赖文件。
- 本地执行
附用户提供的Program.cs代码
using FluentValidation.AspNetCore; using Serilog; using System.Reflection; using MyApp.API.Extensions; var builder = WebApplication.CreateBuilder(args); ConfigurationManager configuration = builder.Configuration; var environment = builder.Environment; // Add services to the container. builder.Services.AddHttpContextAccessor(); builder.Services.AddMvc(); builder.Services.AddControllers().AddNewtonsoftJson(op => op.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore); builder.Services.AddControllers() .AddFluentValidation(options => { options.RegisterValidatorsFromAssembly(Assembly.GetExecutingAssembly()); }); // Add services to the container. builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); // Swagger builder.Services.AddSwaggerGen(); // Register Dependency Injection Service Extension builder.Services.AddDependencyInjection(); // Add services to the container var _logger = new LoggerConfiguration() .ReadFrom.Configuration(builder.Configuration) .Enrich.FromLogContext() .CreateLogger(); builder.Logging.ClearProviders(); builder.Logging.AddSerilog(_logger); builder.Host.UseSerilog((ctx, lc) => lc .WriteTo.Console() .ReadFrom.Configuration(ctx.Configuration)); builder.Services.AddHttpClient(); var app = builder.Build(); app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("../swagger/v1/swagger.json", "My-APP API"); }); app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
内容的提问来源于stack exchange,提问作者Ayobamilaye
相关产品推荐
相关产品推荐

