【问题标题】:Is there a way to identify that IIS or the website had been stopped?有没有办法识别 IS 或网站已停止?
【发布时间】:2012-02-22 00:05:45
【问题描述】:

我有一个 WCF 服务,我使用 IIS 7.5 和 Windows 2008 在 AppFabric 上托管。该服务已按照建议设置为自动启动。 当服务启动时,它会进入一个永不结束的 while 循环,请记住这是所需的行为。 while 循环应该处理一些我不知道它何时可用的数据。

问题是当我关闭网站或 IIS 时,服务继续运行。所以我的问题是:
有没有办法确定 IIS 或网站已停止?
有没有更好的方法来实现这种永无止境的行为?

希望这里有足够的信息。

【问题讨论】:

  • while 循环有什么作用?为什么你需要一个?此信息将有助于解答。
  • 可能是 Windows 服务中的主机?
  • 连同 usr 的问题:您为什么希望服务永远循环?好像……错了。
  • 循环中的服务就像循环中的循环
  • 如果服务在AppPool中运行,则存在主机w3wp.exe进程(即IIS工作进程)。

标签: c# .net wcf appfabric


【解决方案1】:

好的,所以您正在运行一个无限轮询循环。这种设计可能很有意义,尽管它不寻常。

我建议您启动一个单独的线程来进行轮询。您的线程代码应如下所示:

void ThreadProc() {
 try {
  while(true) { ... }
 }
 catch (ThreadAbortException) {
  //AppDomain shutdown
 }
}

关闭时所有线程都将被中止。这是检测关机的技巧。

像这样启动线程:

new Thread(ThreadProc) { IsBackground = true }

【讨论】:

  • 我会尝试这种方法,但这里有一些想法,我认为从来没有 ThreadAbortException,我相信该服务完全托管在 AppFabric 上,而 IIS 只是某种主机,因此终止 IIS 永远不会触发应用程序上的任何错误或奇怪行为,也许有一个我可以连接的事件将帮助我解决这个问题。
  • 如果您的托管进程被终止,则不会收到任何事件。该过程消失。在这种情况下,您将无法收到通知。
【解决方案2】:

关于网站状态检测问题:如果知道站点名称,可以使用Microsoft.Web.Administration API判断站点是否已经启动。 Learn IIS website 上提供了一些很好的示例

但是,我在这里关注其他人为什么要使用无限循环...

【讨论】:

  • 正如我所说,我愿意接受建议,但原因是我正在进行轮询以了解何时处理数据片段。该服务实际上联系了我不拥有的其他服务,所以我不知道它何时被使用过。
  • 我明白了。所以有人打电话给你的服务,它会联系其他服务,对吗?如果是这样,为什么你需要无限等待?使用 WCF 的重点似乎是在请求到达时处理 Web 请求和处理数据……我错过了什么吗?无论如何,您应该能够使用上面的 Microsoft.Web.Administration API 检测站点是否已启动。
  • 该服务的行为类似于 Windows 服务,它应该是完全相同的东西,但我使用的是带有 WCF 的“APPFABRIC”而不是 Windows 服务。所以不,没有人调用它,它应该是自给自足的,一直在运行,轮询数据等待找到适当的信息,然后进行一些处理。
猜你喜欢
  • 1970-01-01
  • 2013-12-25
  • 2018-11-20
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多