我最近开始使用WCF。我在控制台程序中创建了一个WCF服务,并使该控制台程序成为服务本身。它在程序运行时作为Singleton托管,采用以下方式:
var endPointUri = new Uri("http://127.0.0.1:13370/RuntimeService");
var host = new ServiceHost(this, endPointUri);
host.Open();
注意this
如何被指向实例。这很好用,我的控制台应用程序实现了我的IRuntimeService
就好了。
现在,问题出在这里。
如何在解决方案的另一个项目中为此服务添加服务客户端?现在,有一个问题,我必须首先启动控制台应用程序(用于托管服务),然后以某种方式在Visual Studio中添加它(否则它将不可见,对吧?)。当我想要更新服务时,会出现同样的问题。
现在,作为一种解决方法,我打开控制台应用程序的已编译.EXE
文件。然后,在我的项目中,我在.EXE
运行时更新/添加服务客户端。但是,从长远来看,这不是很聪明,因为我在这个项目上有几个开发人员,我希望它有点自动化(也因为我有一个构建服务器运行一些单元测试并根据需要部署服务器)。
有什么方法可以通过编程方式(可能通过命令行)更新我的WCF服务客户端?或者甚至更好,只是在服务本身没有运行时更新它?
答案 0 :(得分:1)
我发现实现这一点的最简单方法是以编程方式定义服务客户端类,并将服务的URI传递给构造函数。所以你的客户端类看起来像这样:
public class RuntimeServiceClient
{
public IRuntimeService service;
public RuntimeServiceClient(string uri)
{
// Setup the address of your service
EndpointAddress address = new EndpointAddress(uri);
//Setup your binding - HttpBinding, NetTcpBinding, etc.
NetTcpBinding binding = new NetTcpBinding(SecurityMode.Transport);
//Setup your binding parameters
ChannelFactory<IRuntimeService> factory = new ChannelFactory<IRuntimeService>(binding, address);
service = factory.CreateChannel();
}
}
然后,当您想要在客户端上访问您的服务时,您可以这样调用它:
string uri = "http://myservice.com/RuntimeService";
RuntimeServiceClient client = new RuntimeServiceClient(uri);
client.service.MyRuntimeServiceFunction();
使用此方法,您永远不必担心让您的客户端与您的服务保持同步。只要您保留对IRuntimeService
接口的引用,就可以调用该服务公开的任何功能。
答案 1 :(得分:0)
您可能必须使用svcutil.exe
手动生成代理类。
有关如何创建代理类的更多详细信息,请参阅以下SO问题。
how to generate client proxy class of a wcf service that will work in the .net 2.0
创建后,您可能需要手动将这些.cs
文件与Web配置文件一起复制到客户端应用程序
快乐编码:)