【问题标题】:How do I create a long lived object in within the IIS/ASP.Net?如何在 IIS/ASP.Net 中创建长期存在的对象?
【发布时间】:2012-12-15 23:07:53
【问题描述】:

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

我有一个在后台线程上创建单例实例的总体思路。不确定在 iis 中执行此操作的最佳方法是什么,希望在应用程序死机时自动重新创建单例。

【问题讨论】:

  • Autofac 等 IoC 容器允许您将某些依赖项配置为单例 - 它会在您的 AppDomain 中维护单个实例,您可以从任何需要的地方访问它。

标签: asp.net asp.net-mvc iis signalr


【解决方案1】:

您是否认为您会在后台线程中设置一些经常检查消息的东西?

我过去曾使用quartz.net 创建计划作业。它们的设置相当简单。您基本上可以说,从 y 时间开始每隔 x 间隔执行一次此作业。无论您使用哪种解决方案,您都可能需要添加错误处理。我认为您的石英作业会继续尝试执行每个 x 间隔,即使它引发异常,但您需要确保首先清除导致异常的任何原因。否则每次运行都会失败。 IE。就像您的消息有问题,以至于每次您尝试广播它时都会出错。

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

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

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

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

希望有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 2016-07-31
    • 2013-02-15
    • 1970-01-01
    相关资源
    最近更新 更多