在ASP.NET MVC中,控制器由控制器工厂(Controller Factory)创建,然后由MVC框架管理其生命周期。根据默认的控制器工厂实现,即DefaultControllerFactory
,创建的控制器实例不会被释放。
为了解决这个问题,可以自定义一个控制器工厂,重写CreateController
方法并在控制器使用完毕后手动释放控制器实例。
以下是一个示例代码:
using System;
using System.Web.Mvc;
public class CustomControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
if (controllerType == null)
{
return base.GetControllerInstance(requestContext, null);
}
else
{
var controller = base.GetControllerInstance(requestContext, controllerType);
requestContext.HttpContext.Items["CurrentController"] = controller; // 将控制器实例存储在HttpContext中,以便后续释放
return controller;
}
}
}
// 在Global.asax.cs中注册自定义控制器工厂
protected void Application_Start()
{
// ...
ControllerBuilder.Current.SetControllerFactory(new CustomControllerFactory());
// ...
}
然后,在控制器使用完毕后,你可以通过以下方式手动释放控制器实例:
protected override void OnResultExecuted(ResultExecutedContext filterContext)
{
base.OnResultExecuted(filterContext);
var controller = filterContext.HttpContext.Items["CurrentController"] as IDisposable;
controller?.Dispose();
}
通过以上代码,控制器实例将会在使用完毕后被手动释放,从而避免内存泄漏问题。请确保在适当的时机释放控制器实例,以避免不必要的资源浪费。