我有一个 ASP.NET Core 8.0 应用程序,我想将一些控制器移动到一个模块(单独的项目)中。为了实现这一点,我必须从以下位置更新启动:
services.AddControllersWithViews()
.AddRazorRuntimeCompilation();
至:
var assembly = typeof(HomeController).Assembly;
services.AddControllersWithViews()
.AddApplicationPart(assembly)
.AddRazorRuntimeCompilation(options =>
{
options.FileProviders.Add(new EmbeddedFileProvider(assembly));
});
当我启动应用程序时,这工作正常(它启动并且所有端点/视图都像以前一样可用),但在运行测试套件时遇到问题。
测试使用 xUnit 运行,并使用基类设置服务实例,然后使用 API 调用和浏览器实例来调用服务上的端点。对于每个测试,都会初始化服务的新实例。在更改之前,内存使用量约为 800MB,运行良好,但更改后,内存使用量上升至 13GB。这是一个包含 200 个测试的测试套件,在运行过程中内存逐渐增加。所以看起来,更改后,每次测试后都没有释放一些内存。
我尝试过的一些事情:
我非常不知道这种变化如何导致内存泄漏,因此任何尝试的线索或想法将不胜感激。
感谢@Guru Stron的评论,我尝试了以下更改,我删除了AddRazorRuntimeCompilation,所以现在的代码如下:
var mvcBuilder = services.AddControllersWithViews()
.AddApplicationPart(assembly);
if (Options.IsDevelopment)
{
mvcBuilder.AddRazorRuntimeCompilation();
}
services.Configure<MvcRazorRuntimeCompilationOptions>(options =>
{
options.FileProviders.Add(new EmbeddedFileProvider(assembly));
});
我所做的另一个更改是将“模块”项目更新为 Web 项目:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<OutputType>Library</OutputType>
而不是之前的样子:
<Project Sdk="Microsoft.NET.Sdk">
我认为这就是造成差异的原因,因为当我这样做时,我实际上在其中一个视图中遇到了编译错误(命名空间到丢失的包)。 200 次测试的内存使用情况现在又回到了之前的水平。
因此,这些更改之一解决了问题,但无论如何,这两种更改都可能是这种情况的最佳实践。