我有一个包含3个项目的解决方案
客户端(第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客户端。 有没有更好的方法来做这一切?
答案 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服务的服务引用(而不是常规程序集引用),就像您设置正确一样。将服务的安装移至其他位置,您的问题将无法重建解决方案。