【发布时间】:2019-01-22 08:27:05
【问题描述】:
我有一个自托管的 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" };
}
}
它泄露了绑定到前一个实例的资源。我使用演示应用程序重现了该问题(稍微修改了 asp.net core api 项目模板)。
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 请求数 - 控制器根本没有被处理。 Profiler 在链的末尾使用 System.Threading.OverlappedData 指示到根的长路径。你能建议这个设置有什么问题吗? sample app
【问题讨论】:
标签: c# asp.net-core memory-leaks