WCF服务与WCF服务通信

时间:2013-09-11 21:17:52

标签: c# performance wcf wcf-data-services wcf-binding

我有一个包含3个项目的解决方案

  1. Winform客户端
  2. 在Windows服务中托管的WCF服务
  3. 在Windows服务中托管的WCF代理
  4. 客户端(第1项)通过服务(第2项)与代理(第3项)进行通信 - 全部使用WCF。 客户端(第1项)通过服务(第2项)从SQL数据库获取信息 - 使用WCF。

    因此我就是这样设计的。 第1项包含一个WCF客户端,通过WCF与第2项进行通信 第2项包含WCF服务,因此它可以为第1项请求提供服务。它还包含一个WCF客户端(与3对话) 第3项包含WCF服务,因此它可以为第2项请求提供服务。

    我在第1项的项目中添加了对项目2的服务引用 我在第2项的项目中添加了对项目3的服务引用

    这是怎么做的,让一切都在一个解决方案中?

    因为第2项和第3项是在2个Windows服务中自托管的,所以每次重新编译我的代码时,我必须在Services.MSC中手动停止第2项和第3项服务,编译,启动第1项和第2项服务,最后通过在visual studio中按play来运行我的Winform客户端。 有没有更好的方法来做这一切?

2 个答案:

答案 0 :(得分:1)

鉴于您的WCF服务和您的代理都托管在Windows服务中并在某些计算机上运行(我想)。您只能使用一个Windows服务来执行wcf代理和wcf服务,这样您只能启动和停止一个服务

答案 1 :(得分:1)

是否从项目位置(可能是bin \ debug文件夹)安装了第2项和第3项(Windows服务)?如果是这样,我猜你遇到了编译器无法编写.exe文件的问题(因为它正在使用,因为服务正在运行)。

在这种情况下,我建议从其他位置安装实际的Windows服务(例如,C:\ WindowsServices \ Service1和C:\ WindowsServices \ Service2)。这样,只要您不对任何一个服务的代码进行更改,就可以在Windows服务运行时编译您的解决方案(包括第1项),因为编译器会将.exe文件写入项目bin \ debug文件夹,而不是实际运行服务的文件夹。

这将允许您更改Windows应用程序,重新编译和测试。

另一种方法是从您拥有Windows应用程序的解决方案中删除(或排除)两个Windows服务。

修改

如果我理解你的问题,你问的是当它们在同一个解决方案中时,引用WCF服务的正确方法是什么?在这种情况下,听起来你已经正确设置了它(虽然这有点难以辨别)。

基本上,对于客户端与WCF服务进行通信,您需要引用该服务,以便生成代理。代理是您用来与服务实际通信的内容。

项目1将具有对项目2(WCF服务)的服务引用。

项目2将具有对项目3(另一个WCF服务)的服务引用。

第2项本身就是一个WCF服务的事实并不妨碍它成为另一个不同的WCF服务的客户端。

只要您使用WCF服务的服务引用(而不是常规程序集引用),就像您设置正确一样。将服务的安装移至其他位置,您的问题将无法重建解决方案。