【发布时间】: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 然后将被调用一次。