You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 03:05:19