从同一进程托管和使用WCF服务

时间:2009-12-24 18:54:41

标签: c# .net wcf wcf-client wcf-hosting

您是否可以通过托管WCF服务的进程成为WCF服务的客户端?我尝试在同一个过程中创建单独的App域,但仍然没有成功。该服务已确认可在Http,Net.TCP和Net.Pipe上使用。

感谢您的帮助!

纳特

4 个答案:

答案 0 :(得分:3)

即使在使用ServiceModelEx的InProcFactory时,我也遇到了同样的问题。

事实证明,如here所述,您需要将ServiceBehavior设置为而不是 UseSynchronizationContext

[ServiceBehavior(UseSynchronizationContext = false)]
public class MyService : IMyService {}

答案 1 :(得分:2)

您可以尝试使用IDesign的ServiceModelEx程序集,这简化了为WCF服务创建进程内客户端的过程。

程序集包含一个InProcFactory类,可动态创建Net.Pipe端点和服务代理。

ServiceModelEx from IDesign.net

答案 2 :(得分:1)

是。托管WCF服务后,您必须在单独的线程中调用托管服务上的方法。

答案 3 :(得分:1)

我不知道您的特定问题是什么,但我在同一进程中使用WCF服务时遇到了问题。我的问题是我的应用程序在从客户端调用服务后会挂起一分钟,最后返回超时异常。我想这与在等待来自服务器的响应时线程上的阻塞调用有关...如果服务器被阻塞,这是一个问题。我使用的是命名管道,我没有尝试任何其他选项。

参孙的上述建议可能有效,但我是以其他方式做到的。我通过线程创建了服务和监听器,而不是在线程上调用托管服务。这似乎工作正常。

现在有点偏离主题 - Firestrand问你为什么要在你自己的应用程序中这样做。我正在创建一个Windows服务,以及一个需要与之通信的单独的WPF应用程序UI。但是,调试Windows服务是一种痛苦,因此很多服务工作(包括WCF调用)都会进入一个单独的DLL,我可以在“测试”模式下在UI应用程序中引用它,它基本上只调用启动例程实际的Windows服务会。这允许我调试UI和“模拟”服务,而无需附加到进程,运行多个进程等。它似乎工作得很好。一旦UI和DLL完成,我将简单地创建实际的Windows服务,它基本上只是DLL的包装器,然后至少隐藏UI上的测试模式。只是想我会分享以防其他人发现这种方法可能会有所帮助。