У меня есть само размещаемое основное приложение asp.net, которое иногда вызывает его WebHost в новом контексте. Приложение регистрирует общий ресурс в виде одиночного файла в контейнере asp.net DI.
services.AddSingleton<MyDep>();
Контроллер зависит от ресурса общего ресурса:
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
public MyDep Dep { get; }
public ValuesController(MyDep dep)
{
Dep = dep;
}
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
return new string[] {
new string(Dep.Content),
"value2" };
}
}
Утечка ресурсов, связанных с предыдущим экземпляром. Я воспроизвел проблему, используя демонстрационное приложение (слегка измененный шаблон проекта ядра app asp.net).
public static void Main(string[] args)
{
var p = new Program();
while (true)
{
p.Boot(args);
GC.Collect(2, GCCollectionMode.Forced, true);
}
}
private void Boot(string[] args)
{
webHost = CreateWebHostBuilder(args).Build();
webHost.RunAsync();
Thread.Sleep(5000);
webHost.StopAsync().Wait();
webHost.Dispose();
}
Я вижу n экземпляров контроллера, где n - это число http-запросов к контроллеру - контроллер вообще не удаляется.
Профилировщик указывает длинный путь к корню с System.Threading.OverlappedData в конце цепочки. Не могли бы вы подсказать, что не так с этой настройкой?
пример приложения
путь к корню