如何在IIS/ASP.Net中创建长期存在的对象?

apa*_*mer 5 asp.net iis asp.net-mvc signalr

我目前正在使用SignalR in和ASP.Net MVC 4 appliation.我正在使用来自RabbitMQ的消息,实质上需要在新消息到达队列时通过SignalR进行广播.问题是在正常使用情况下,没有一个长寿命对象可以在IIS中存在的地方.我每秒收到大约1000封邮件,因此通过从外部队列监控服务/应用程序发出请求将邮件推送到IIS的标准方法几乎会杀死我的IIS.

我有一个在后台线程上创建单例实例的一般想法.不确定在iis中执行此操作的最佳方法是什么,如果应用程序死亡,则希望自动重新创建单例.

Ben*_*man 1

您是否认为后台线程中会有一些东西可以经常检查消息?

我过去曾使用quartz.net创建计划作业。它们的设置相当简单。您基本上可以说,从 y 时间开始,每隔 x 时间间隔执行此作业。无论您采用什么解决方案,您可能都需要添加错误处理。我认为您的quartz作业将继续尝试执行每个x间隔,即使它抛出异常,但您需要确保首先清除导致异常的任何内容。不然每次运行都会失败。IE 喜欢如果您的消息有问题,那么每次您尝试广播它时都会出错。

注意应用程序的 IdleTimeout。如果 IIS 让你的 Web 应用程序进入睡眠状态,你的后台工作/石英作业中的单例也会进入睡眠状态。如果将 IdleTimeout 设置为 0,您的应用程序将永远不会休眠。

如果您在 Global.asax.cs Application_Start() 中初始化您的作业/工作人员,您的作业将始终在您的 Web 应用程序开始时启动。

当您首次部署应用程序或更新或重新启动应用程序时,您需要确保您的应用程序正在运行。不确定 IIS 中是否有此设置。但通常情况下,您的应用程序在收到请求之前不会启动。祝你好运。如果您找到解决方案,请告诉我。

如果您的应用程序因其他原因崩溃,同样的处理方式。您需要一些东西来重新启动您的网络应用程序。

希望有帮助!