1

我只是在学习如何使用 WCF 服务,我是按照这篇 MSDN 文章中的 6 步教程开始的。第 4 部分讨论了使用 svcutil.exe 生成客户端代码,第 5 部分显示了一个配置 WCF 客户端的大型 XML 文件。相对于我为 WCF 演示采用的非常简单的解决方案,使用 svcutil.exe和这个 XML似乎太重了:

class Program
{
    static void Main(string[] args)
    {
        WSHttpBinding bhb = new WSHttpBinding();
        EndpointAddress epa = new EndpointAddress("http://localhost:8000/index/ServiceReference1");
        ChannelFactory<ServiceReference1.IDemoChannel> cf = new ChannelFactory<ServiceReference1.IDemoChannel>(bhb, epa);

        cf.Open(); 
        ServiceReference1.IDemoChannel channel = cf.CreateChannel();
        channel.Open();

        String s = channel.getHelloWorld(5);
        channel.Close();
        cf.Close();
        Console.WriteLine("Result: {0}", s);
        Console.WriteLine("I'm the client! Press Enter to exit...");
        Console.ReadLine();
    }
}

看到这两种非常不同的客户端配置方式后,我想知道使用生成的代码和 XML 文件有什么好处,什么时候比编程方式更好?

更新:我在本教程的第 5 部分重新阅读了 XML 文件,似乎 XML 文件被复制了,并且查看了预期的 XML,我收回了我的问题的 XML 方面。我想我真正要问的是“为什么我要使用 svcutil.exe 生成我的代码,而编写客户端代码看起来还不错”?

4

3 回答 3

1

在我看来:始终使用 XML,因为您可以在部署程序后更改它,您只需要重新启动服务。

如果您使用演示代码,则需要重新构建、重新编译、重新部署等,这比使用XML得多。

于 2013-02-19T22:15:37.660 回答
1

除了可以轻松更改 xml 配置之外,svcutil(或向项目添加服务引用)的另一个巨大好处是 wcf 方法所需和返回的自动生成类型,这些类型可供您使用,无需引用声明程序集. 在方法返回字符串的 hello world 示例中,这无关紧要,但大型 wcf 实现可能有许多请求/响应类型。

于 2013-02-19T22:48:34.223 回答
0

“当编写客户端代码看起来还不错时,为什么我要使用 svcutil.exe 生成我的代码”?

当您编写一个简单的测试程序时,您在代码中所做的工作效果很好。

当您开发需要团队和长期维护的大型应用程序时,xml 配置是更好的选择。想象一下,服务是由一个完全不同的团队编写和维护的,他们不会让你阅读他们的代码。客户端配置必须与服务上的配置完全匹配。当服务团队更改 uri、端口或使用证书 (https) 时,作为客户端开发人员,您将如何发现?调用将失败(可能带有非常无信息的错误消息)。你如何解决它?只需再次运行 svcutil 并重新生成配置。无需召开会议、阅读(希望)更新的文档等。

回到您发布的示例测试代码:当您的服务到达部署在 localhost 以外的其他地方的那一刻,您必须重新编译客户端,除了更新 url...在配置中定义连接信息的值。在那之前,不要担心。

于 2013-02-19T23:17:57.533 回答