iis 不释放System.Web.Mvc.IControllerFactory. Controller创建的控制器

ou6hu8tu  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(111)

我已经创建了一个类SystemConfig-从IControllerFactory派生,我想用它来创建控制器。
在Global.asax.cs Application_Start()中,我示例化SystemConfig并注册它:

var system = new SystemConfig();
ControllerBuilder.Current.SetControllerFactory(system);

SystemConfig中,我实现了CreateController

public IController CreateController(RequestContext requestContext,
    String controllerName)
{
    switch (controllerName.ToLower())
    {
        case "log": return new Controllers.LogController();
        case "account": return new Controllers.AccountController( args as needed );

这似乎很好用。例如,AccountController公开的端点按预期处理请求。
但是CreateController中新艾德的控制器永远不会被释放。IIS进程使用的内存不断增长。
我生成了一个转储文件,并使用WinDbg对其进行了检查

!dumpheap -type MyApp.Controllers.AccountController -stat

发现有4372个AccountController示例。应用程序运行的时间越长,留在内存中的控制器就越多
29小时后,App Pool被回收,内存压力得到缓解,但这不是一个好的解决方案。
为什么在处理完Web请求并向客户端返回响应后,AccountController示例没有被释放?

icomxhvb

icomxhvb1#

使用OP中显示的代码,控制器示例应该超出范围并获得 garbage-collected(这与获得 disposed 不同)once they've handled requests
我猜

  • 要么是真实的代码看起来与这里所示的不同,以便其他一些代码保持控制器示例,
  • 或者控制器在运行时用依赖项或全局变量“注册”自己,例如:通过调用某个方法并将this作为参数传递,
  • 或者控制器启动一些长时间运行的任务(日志记录?),永远不会正确终止。

如果你想 dispose 控制器,你可以让SystemConfig实现ReleaseController方法,但这只有在控制器实际实现IDisposable时才有意义,或者保留这样做的资源。

tuwxkamq

tuwxkamq2#

感谢你的评分
起初我认为你的建议都不合适。
但是我已经创建了AccountController作为一个单例- SystemConfig示例化它并将其保存在类成员中。然后在xmlController中,我只是返回了成员。
但这产生了错误:* 控制器“Controllers.AccountController”的单个示例不能用于处理多个请求。如果正在使用自定义控制器工厂,请确保它为每个请求创建一个新的控制器示例。*
所以我每次打电话给控制器时都艾德它
但作为一个单体,它需要随时了解配置的变化。所以我创建了一个“Config”对象,它公开了一个事件“OnChange”,AccountController订阅了它。
这就是为什么会计总监
由于AccountController不再是单例,因此它不需要订阅OnChange事件

相关问题