WCF基本开发流程
最近在学习WCF,个人觉得WCF对构建.NET平台的分布式处理架构很有用。Java下有EJB,而.NET下似乎没有这么强大的工具,怪不得在一些超大型的应用中用的都是Java。但我相信.NET很快会赶上的,并且会做得更好。
WCF的示例代码微软给了挺多,但是文档却不好找,更不用说循序渐进的教程了,这样初学的人根本没有个头绪,不知道该从哪里开始。
在网上找到一本《Programming WCF》,感觉很不错,正是我需要的那种书。但是书上对WCF的完整开发流程介绍得不是很详细,再加上WCF的VS 2005插件本身有点小错误,让我在做第一个程序的时候折腾了好一会儿。
下面我简单描述下怎样一步步的搭建一个WCF的服务和它的客户端。 先新建一个控制台程序项目,然后右击添加新项,如果你装了VS2005的WCF扩展的话,你可以看到"WCF Service"项,现在新建一个名为TestService的WCF服务。
项目中现在多了一个TestService.cs文件,这个文件乍看有点长,但其实前面都是注释,结构也很简单。
现在再建一个App.config,把TestService头部的那段示例配置复制到App.config中。然后,把 <service type="XXX.TestService" 改成 name="XXX.TestService" 这点很重要!这是WCF插件的错误。
然后在returnFaults这个默认behavior中添加
改完后的文件像这样:
<?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"一项,点中,会出来一个窗口:
点Browser按钮,把刚刚复制的Uri粘贴到URL栏,如果你的服务有正常在运行的话,你可以看到这样一个页面:
点中第一个链接,类似 http://localhost:8080/WCF_Lab0/TestService?wsdl 的那个。你可以在页面上看到 MyOperation1() 方法,现在命名一下Web reference name,改为TestService,然后点"Add reference"按钮,IDE就会帮我们生成客户端的代码和配置了。
前面的Browser步骤不是必须的,如果你确认你的Service的元数据(MetaData)是可以获得的话,那么你可以直接用你的服务的Uri + ?wsdl,在Add Service Reference的第一个窗口就直接添加引用。如果应用不成功请检查服务是否正常运行,serviceBehaviors中是否设置了
现在来修改下自动生成的客户端配置,把不需要的东西去掉。去掉
改完的配置变得很短:
<?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运行客户端程序。
最终运行结果如下: