我已经创建了一个类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
示例没有被释放?
2条答案
按热度按时间icomxhvb1#
使用OP中显示的代码,控制器示例应该超出范围并获得 garbage-collected(这与获得 disposed 不同)once they've handled requests。
我猜
this
作为参数传递,如果你想 dispose 控制器,你可以让
SystemConfig
实现ReleaseController方法,但这只有在控制器实际实现IDisposable时才有意义,或者保留这样做的资源。tuwxkamq2#
感谢你的评分
起初我认为你的建议都不合适。
但是我已经创建了AccountController作为一个单例- SystemConfig示例化它并将其保存在类成员中。然后在xmlController中,我只是返回了成员。
但这产生了错误:* 控制器“Controllers.AccountController”的单个示例不能用于处理多个请求。如果正在使用自定义控制器工厂,请确保它为每个请求创建一个新的控制器示例。*
所以我每次打电话给控制器时都艾德它
但作为一个单体,它需要随时了解配置的变化。所以我创建了一个“Config”对象,它公开了一个事件“OnChange”,AccountController订阅了它。
这就是为什么会计总监
由于AccountController不再是单例,因此它不需要订阅OnChange事件