.NET 8发布Web应用后出现Swashbuckle.AspNetCore.SwaggerGen找不到异常
.NET 8 Web应用发布后抛出FileNotFoundException:无法加载Swashbuckle.AspNetCore.SwaggerGen
问题现象
调试环境运行正常,发布到文件夹后启动报错,提示无法加载程序集Swashbuckle.AspNetCore.SwaggerGen,已确认NuGet包已安装。
相关代码与配置
启动代码
WebApplicationBuilder builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); // 问题关联行 builder.Services.AddDistributedMemoryCache(); builder.Services.AddSession(options => { options.IdleTimeout = TimeSpan.FromSeconds(60); options.Cookie.HttpOnly = false; options.Cookie.IsEssential = true; }); var app = builder.Build(); if (!app.Environment.IsDevelopment()) { app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseSession(); app.MapControllerRoute("default", "{controller}/{action=Index}/{id?}"); app.MapFallbackToFile("index.html"); return app;
项目csproj配置
<PropertyGroup> <TargetFramework>net8.0</TargetFramework> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> <SpaRoot>..\prodschedule.client</SpaRoot> <SpaProxyLaunchCommand>npm start</SpaProxyLaunchCommand> <SpaProxyServerUrl>https://localhost:4200</SpaProxyServerUrl> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.AspNetCore.SpaProxy"> <Version>8.*-*</Version> </PackageReference> <PackageReference Include="Microsoft.Extensions.ApiDescription.Server" Version="8.0.8"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> <PackageReference Include="Microsoft.OpenApi" Version="1.6.18" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.7.3" /> <PackageReference Include="Swashbuckle.AspNetCore.Swagger" Version="6.7.3" /> <PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.7.3" /> <PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="6.7.3" /> </ItemGroup> <ItemGroup> <Content Include="Sql\**"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup> <ItemGroup> <ProjectReference Include="..\prodschedule.client\prodschedule.client.esproj"> <ReferenceOutputAssembly>false</ReferenceOutputAssembly> </ProjectReference> <ProjectReference Include="W:\Improvement\Client Subscriptions\SubHashes\SubHashes.csproj" /> <ProjectReference Include="W:\Improvement\Libraries\CSharp\ApiLibrary\Holidays\Holidays.csproj" /> <ProjectReference Include="W:\Improvement\Libraries\CSharp\ApiLibrary\Http\Http.csproj" /> <ProjectReference Include="W:\Improvement\Libraries\CSharp\ApiLibrary\Ostendo\Ostendo.csproj" /> <ProjectReference Include="W:\Improvement\Libraries\CSharp\CSLogger\CSLogger.csproj" /> <ProjectReference Include="W:\Improvement\Libraries\CSharp\Utility\Utility.csproj" /> </ItemGroup> </Project>
解决方法
1. 检查NuGet包的私有资产设置
确认Swashbuckle.AspNetCore.SwaggerGen的包引用没有被设置<PrivateAssets>all</PrivateAssets>——这个配置会阻止包文件被复制到发布目录。当前你的csproj里该包没这个配置,但可以检查其他关联包是否有类似限制。
2. 强制指定包的复制行为
在csproj的<ItemGroup>里给Swashbuckle.AspNetCore.SwaggerGen添加明确的私有资产配置,确保它能被复制到发布目录:
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.7.3"> <PrivateAssets>none</PrivateAssets> </PackageReference>
3. 清理后重新发布
- 运行
dotnet clean清理项目残留文件 - 运行
dotnet restore重新还原所有NuGet包 - 运行
dotnet publish -c Release重新执行发布操作
4. 验证发布目录的文件
发布完成后,去发布文件夹的bin目录下查看是否存在Swashbuckle.AspNetCore.SwaggerGen.dll以及相关的Swashbuckle依赖文件。如果还是缺失,暂时把调试环境下的对应dll复制到发布目录测试是否能正常启动。
5. 排查间接依赖冲突
检查你项目引用的其他类库(比如SubHashes、Holidays等项目)是否引用了不同版本的Swashbuckle包,版本冲突可能导致发布时依赖丢失。把所有项目的Swashbuckle包版本统一为6.7.3。
6. 确认发布模式
如果用的是独立部署模式,要确保所有依赖都被包含在发布包中;默认的框架依赖模式下,.NET运行时会处理大部分依赖,但仍需确认Swashbuckle这类第三方包被正确包含。
内容的提问来源于stack exchange,提问作者Joseph Coulter
相关产品推荐
相关产品推荐

