【问题标题】:Executing Process.Kill code when WCF service is being disposed正在处理 WCF 服务时执行 Process.Kill 代码
【发布时间】:2014-09-10 16:54:54
【问题描述】:

我有一个托管在 IIS 上的 WCF 服务,它通过 COM 接口引用旧工具。 这个遗留工具对我来说是一个黑匣子,所以我无法更改它的代码或修复其中的错误。 当我重新启动我的 WCF 服务,或通过 IIS 管理工具停止它时,引用的旧工具也应该关闭,连同它使用的所有其他非托管数据,并在重新启动的 WCF 服务的第一次调用时重新启动。

一切正常,除了这个旧工具上的一个函数调用。如果我调用这个特定的函数,那么工具内部可能存在一些错误,即使我停止了 WCF 服务,它也不会出现故障。

我想到了一种解决方法,每次处理我的 WCF 服务应用程序时,我都会调用 Process.Kill 函数。我的困难是我找不到合适的地方来称呼它。

首先我尝试让我的Service行为类继承自IDisposable,然后实现一个Dispose方法。问题是每次函数完成流程时都会调用 Dispose,但我当然不能每次调用都终止旧工具。

我的 WCF 服务通过 Net Pipe 通道 与客户端应用程序通信,因此据我了解,我无法使用 Global.asax 文件。 p>

我的问题是 - 调用 Process.Kill 代码的合适位置在哪里,如果我希望它只被调用一次,当整个 WCF 服务应用程序被释放时。

谢谢。

【问题讨论】:

  • 如果 IDisposable 被每个函数调用,这意味着你的服务实例上下文模式是 PerCall ?如果是这样,可以将其切换到 Single 吗?这样您的服务实例生命周期将与运行时生命周期保持一致? msdn.microsoft.com/en-us/library/…
  • 我用来与服务通信的客户端在每次调用后都会关闭通道,我不能也不应该更改它。如果我将Service上下文模式改为Single,会不会导致两者之间的通信出现问题?
  • 它不应该,如果它为每个调用创建一个新实例,它应该对所有调用都使用一个实例,这意味着服务是完全无状态的,.. 通常相反的情况是一种可能导致问题的方法,将其从 Single 切换到 Percall,因为它会终止调用中使用的任何状态。所以我会尝试将该服务切换到 Single,IDisposable 然后将被调用一次。

标签: c# .net wcf


【解决方案1】:

最后我通过在服务行为的静态构造函数中调用Kill进程代码解决了这个问题。这个构造函数即使在 PerCall 上下文模式下也会被调用一次,所以实际上对我来说,它的效果就像我在单上下文模式下调用 Dispose 阶段的代码一样。 谢谢大家。

【讨论】:

    【解决方案2】:

    您需要实现一个自定义服务工厂来拦截关闭事件,请参阅: Performing action before WCF service is shutdown

    【讨论】:

      猜你喜欢
      • 2019-02-17
      • 2016-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      相关资源
      最近更新 更多