【问题标题】:Updating a WCF service in this case? Maybe programmatically?在这种情况下更新 WCF 服务?也许以编程方式?
【发布时间】:2014-03-03 23:36:34
【问题描述】:

我最近开始使用 WCF。我在控制台程序中创建了一个 WCF 服务,并将该控制台程序作为服务本身。在程序运行时,它被托管为单例,方式如下:

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 服务客户端?或者更好的是,在服务本身未运行时更新它?

【问题讨论】:

    标签: wcf


    【解决方案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 接口的引用,就可以调用服务公开的任何函数。

    【讨论】:

    • 现在,当我尝试在客户端调用方法时,我收到一些关于手动寻址的奇怪错误。我确定地址是正确的。我做错了什么?
    • 您使用的是什么绑定类型?如果是 WebHttpBinding,请参阅此问题以获取可能的解决方案。 stackoverflow.com/questions/1798069/…
    【解决方案2】:

    您可能必须使用svcutil.exe 手动生成代理类。

    有关如何创建代理类的更多详细信息,请参阅下面的 SO 问题。

    how to generate client proxy class of a wcf service that will work in the .net 2.0

    创建之后,您可能需要手动将这些 .cs 文件连同 Web 配置文件复制到您的客户端应用程序中

    MSDN

    快乐编码:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      • 1970-01-01
      • 1970-01-01
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多