WCF基本开发流程

分享.NETWCF by 达达 at 2007-03-14

最近在学习WCF,个人觉得WCF对构建.NET平台的分布式处理架构很有用。Java下有EJB,而.NET下似乎没有这么强大的工具,怪不得在一些超大型的应用中用的都是Java。但我相信.NET很快会赶上的,并且会做得更好。

WCF的示例代码微软给了挺多,但是文档却不好找,更不用说循序渐进的教程了,这样初学的人根本没有个头绪,不知道该从哪里开始。

在网上找到一本《Programming WCF》,感觉很不错,正是我需要的那种书。但是书上对WCF的完整开发流程介绍得不是很详细,再加上WCF的VS 2005插件本身有点小错误,让我在做第一个程序的时候折腾了好一会儿。

下面我简单描述下怎样一步步的搭建一个WCF的服务和它的客户端。 先新建一个控制台程序项目,然后右击添加新项,如果你装了VS2005的WCF扩展的话,你可以看到"WCF Service"项,现在新建一个名为TestService的WCF服务。

step1.png

项目中现在多了一个TestService.cs文件,这个文件乍看有点长,但其实前面都是注释,结构也很简单。

现在再建一个App.config,把TestService头部的那段示例配置复制到App.config中。然后,把 <service type="XXX.TestService" 改成 name="XXX.TestService" 这点很重要!这是WCF插件的错误。

然后在returnFaults这个默认behavior中添加 设置。这个设置让WCF的Host可以自动为你生成MetaData页面,客户端才能引用到你的WCF服务。

改完后的文件像这样:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <!-- Before deployment, you should remove the returnFaults behavior configuration to avoid disclosing information in exception messages -->
      <service name="WCF_Lab0.TestService" behaviorConfiguration="returnFaults">
        <endpoint contract="WCF_Lab0.ITestService" binding="wsHttpBinding"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="returnFaults" >
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

接下来在控制台程序的Main函数中添加如下代码:

    MyServiceHost.StartService();

    Console.ReadLine();

    MyServiceHost.StopService();

MyServiceHost 是生成 TestService.cs 时一并生成的一个静态类,用来简单的Host我们的WCF服务,因为我们只是实验所以直接用就可以,以后的文章会详细描述怎么Host一个WCF服务。

现在运行下这个项目,没有错就继续下面的步骤,创建客户端程序。

再新建一个控制台程序。

然后,我们回到TestService.cs中,找到 MyServiceHost 的 StartService 方法中的baseAddress声明,把那串Uri复制下来。然后 Ctrl+F5 把服务端运行起来,但不Debug,这样我们才能继续操作IDE。

在客户端控制台程序项目右击应该可以看到"Add Service Reference"一项,点中,会出来一个窗口:

step2.png

点Browser按钮,把刚刚复制的Uri粘贴到URL栏,如果你的服务有正常在运行的话,你可以看到这样一个页面:

step3.png

点中第一个链接,类似 http://localhost:8080/WCF_Lab0/TestService?wsdl 的那个。你可以在页面上看到 MyOperation1() 方法,现在命名一下Web reference name,改为TestService,然后点"Add reference"按钮,IDE就会帮我们生成客户端的代码和配置了。

前面的Browser步骤不是必须的,如果你确认你的Service的元数据(MetaData)是可以获得的话,那么你可以直接用你的服务的Uri + ?wsdl,在Add Service Reference的第一个窗口就直接添加引用。如果应用不成功请检查服务是否正常运行,serviceBehaviors中是否设置了

现在来修改下自动生成的客户端配置,把不需要的东西去掉。去掉 这一节,然后把endpoint中的 bindingConfiguration 属性去掉。如果你的Windows使用的是NT帐号登录,可能会有一段,也一起把它去掉。

改完的配置变得很短:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <client>
            <endpoint address="http://localhost:8080/WCF_Lab0/TestService"
                binding="wsHttpBinding" 
                contract="Client.TestService.ITestService" name="WSHttpBinding_ITestService">
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>

然后在客户端中的 Main 函数中添加如下代码:

    TestServiceClient client = new TestServiceClient();

    Console.WriteLine(client.MyOperation1("www.unbe.cn"));

    Console.ReadLine();

TestServiceClient 是IDE自动生成到 TestService 命名空间下的客户端类。

把客户端设置为启动项,把客户端运行起来,如果刚刚你有把服务端程序关闭的话,请先把服务器端运行起来,记得不是Debug,这样我们才能继续通过IDE运行客户端程序。

最终运行结果如下:

step4.png