答案:之后
运行测试后,看起来范围内的服务在响应完成发送之后被释放。这是不幸的,因为如果响应是一个大文件,可能需要几秒钟才能完成向客户端的发送,并且服务将不必要地一直保持活动状态(未释放)。如果在响应开始发送之前处置范围内的服务会更好。
不管怎样,这是我做的测试。
首先,我创建了一个测试IDisposable 类,该类在实例化和处置时写入控制台:
public sealed class DisposableTest : IDisposable
{
public DisposableTest()
{
Console.WriteLine("//////////////////// Created");
}
private bool Disposed = false;
public void Dispose()
{
if (!Disposed)
{
Disposed = true;
Console.WriteLine("//////////////////// Disposed");
}
}
}
然后我在 Program.cs 中添加了作用域服务(对于 ASP.NET 6):
services.AddScoped<DisposableTest>();
接下来,我添加了一些中间件,以便在运行 Response.OnStarting() 和 Response.OnCompleted() 事件时写入控制台:
app.Use(async delegate (HttpContext Context, Func<Task> Next)
{
Context.Response.OnStarting(delegate ()
{
Console.WriteLine("//////////////////// Response Started");
return Task.CompletedTask;
});
Context.Response.OnCompleted(delegate ()
{
Console.WriteLine("//////////////////// Response Completed");
return Task.CompletedTask;
});
await Next();
});
最后我将服务添加到 HomeController 的构造函数中,以便访问它:
public class HomeController : Controller
{
public HomeController(DisposableTest TheTest) { }
public IActionResult Index() { return View(); }
}
访问/home/index路径后,IIS Express控制台显示如下:
响应完成发送后,服务似乎已被释放。