WCF简单教程(1) 入门
来源:互联网 发布:linux 压缩文件 编辑:程序博客网 时间:2024/05/16 13:43
WCF是DotNet体系中很重要的一项技术,但是组内很多组员通过书籍自学的时候感觉涉及面太广、配置文件太复杂,新名词太多、抓不到头绪,有感于此,决定进行一次组内技术培训,顺便把培训讲义整理到blog上来。不求大而全,而是要让初学者快速入门,因此想入实例入手,并刻意隐藏一些初期用不到的内容,以降低入门门槛。有任何错误欢迎指正。
注:本系列文章基于.Net Framework 3.5,以教程的最后会归纳一下到了4.0中有哪些差异。
----------------------- 分隔线 -----------------------
第一篇:入门,构建第一个WCF程序
1、服务端
建立一个控制台应用程序作为Server,新建一个接口IData作为服务契约。这个契约接口一会儿也要放到Client端,这样双方才能遵循相同的标准。别忘了添加对System.ServiceModel的引用。
- using System;
- using System.ServiceModel;
- using System.Text;
- namespace Server
- {
- /// <summary>
- /// 用ServiceContract来标记此接口是WCF的服务契约,可以像WebService一样指定一个Namespace,如果不指定,就是默认的http://tempuri.org
- /// </summary>
- [ServiceContract(Namespace="WCF.Demo")]
- public interface IData
- {
- /// <summary>
- /// 用OperationContract来标记此方法是操作契约
- /// </summary>
- [OperationContract]
- string SayHello(string userName);
- }
- }
针对这个接口建立实现类,这个类才是真正干活的,工作在服务端,不出现在客户端:
- using System;
- using System.Text;
- namespace Server
- {
- /// <summary>
- /// 实现IData接口,此处不需要写契约标记
- /// </summary>
- public class DataProvider : IData
- {
- public string SayHello(string userName)
- {
- return string.Format("Hello {0}.", userName);
- }
- }
- }
为工程添加一个App.config文件,这里面要定义与服务发布相关的参数。WCF中常见的做法是用代码写服务逻辑,但是用配置文件来定义服务发布方式,这样做的好处是松散耦合。
- <?xml version="1.0" encoding="utf-8" ?>
- <configuration>
- <system.serviceModel>
- <!-- 看到services节,就表明这是在定义服务相关的内容 -->
- <services>
- <!-- 定义一个服务,name是契约实现类的全名 -->
- <service name="Server.DataService">
- <!-- 既然要对外提供服务,就要有服务地址,此处定义为 http://localhost:8080/wcf,需要注意,地址总是带着类型标头的 -->
- <host>
- <baseAddresses>
- <add baseAddress="http://localhost:8080/wcf" />
- </baseAddresses>
- </host>
- <!-- 定义一下终节点,address一般为空,如果不为空,最终服务地址就是在baseAddress的基础上加上这个address,binding指定为basicHttpBinding,这是最基础的基于http的绑定方式,contract标明这是为哪个契约服务 -->
- <endpoint address="" binding="basicHttpBinding" contract="Server.IData" />
- </service>
- </services>
- </system.serviceModel>
- </configuration>
万事具备,只剩最后一步了,将服务发布出去:
- using System;
- using System.ServiceModel;
- namespace Server
- {
- class Program
- {
- static void Main(string[] args)
- {
- //定义一个ServiceHost,注意参数中要使用契约实现类而不是接口
- using(ServiceHost host = new ServiceHost(typeof(Server.DataProvider)))
- {
- host.Open();
- Console.WriteLine("Service Running ...");
- Console.ReadKey();
- host.Close();
- }
- }
- }
- }
有人可能会问服务发布到哪去了?没指定地址呀?这是一个初学者容易搞不明白的地方。
是的,此时App.config中的定义就发挥作用了,由于ServiceHost中指定对Server.DataProvider类服务,而App.config中定义了name="Server.DataProvider"的service,其下有endpoint,定义了绑定方式是basicHttpBinding,而http方式的baseAddress只有一个,就是 http://localhost:8080/wcf。
编译运行,屏幕显示Service Running ... 就是正常跑起来了,此时如果用命令行 netstat -ano | findstr "8080" 看一下,应该有如下输出:
- TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 4
- TCP [::]:8080 [::]:0 LISTENING 4
表示我们的程序已经在TCP 8080端口开始监听了。值得注意的是PID是4,这是系统进程而不是我们自己的进程,这说明WCF程序对外提供HTTP服务时,是借用了系统功能(http.sys)。
此时如果我们用浏览器访问一下 http://localhost:8080/wcf,不报错,但是会提示“当前已禁用此服务的元数据发布”,这是由于默认不允许以http get方式获取服务的WSDL,我们不用管它,不影响后面的使用,以后的章节中我们再来看这个问题。
2、客户端
再建立一个控制台应用程序作为Client,把Server中的接口IData拷过来,因为这是服务契约。
为工程添加一个App.config文件,这里面要定义客户端访问的相关参数,这里我去掉了一些用不上的参数,以保持配置文件简单,防止各位看晕了头。
- <?xml version="1.0" encoding="utf-8" ?>
- <configuration>
- <system.serviceModel>
- <!-- 看到client,就表明是客户端设置 -->
- <client>
- <!-- 定义访问时的终节点,name也是随意取的,注意address是Server端发布时指定的baseAddress+endpoint的address,binding也要对应,contract就更不用说了,由于之前把IData.cs拷过来的时候没有修改命名空间,所以还是Server.IData -->
- <endpoint name="DataService" address="http://localhost:8080/wcf" binding="basicHttpBinding" contract="Server.IData" />
- </client>
- </system.serviceModel>
- </configuration>
然后写代码,来调用Server端发布的SayHello方法:
- using System;
- using System.ServiceModel;
- using System.ServiceModel.Channels;
- namespace Client
- {
- class Program
- {
- static void Main(string[] args)
- {
- //客户端访问有多种方式,此处只显示一种
- //利用ChannelFactory的CreateChannel方法创建一个IData的代理对象,其中参数“DataService”就是刚才在App.config中定义的endpoint的名称
- var proxy = new ChannelFactory<Server.IData>("DataService").CreateChannel();
- //调用SayHello方法
- Console.WriteLine(proxy.SayHello("WCF"));
- //用完后一定要关闭,因为服务端有最大连接数,不关闭会在一定时间内一直占着有效连接
- ((IChannel)proxy).Close();
- }
- }
编译运行,屏幕应能正常打印出“Hello WCF.”。第一个入门demo就搞定了,应该还是比较简单的。只是App.config的配置有些复杂,后面我们会看到,其实也可以不要配置,直接用代码搞定,不过从松散耦合的角度讲不建议这么做。
本文出自 “汪汪爱杨杨” 博客,请务必保留此出处http://boytnt.blog.51cto.com/966121/796884
- WCF简单教程(1) 入门
- WCF简单教程(1) 入门
- WCF入门简单教程(图文) VS2010版
- WCF入门简单教程(图文) VS2010
- WCF技术简单入门
- WCF入门到精通系列教程第1篇:Hello WCF
- WCF入门---创建一个简单的WCF程序
- WCF笔记(1)初识WCF简单应用
- Access入门简单教程
- modelsim入门简单教程
- python入门简单教程
- Github简单教程--入门
- WCF教程
- 简单的WCF练习(1)
- [原创]WCF入门级使用教程(转载请注明出处)
- WCF 入门
- WCF入门
- WCF入门
- 终止线程的运行
- Windows OOP与Cocoa MVC对比
- JS选择文件夹对话框(实现文件夹上传) .
- Rest in sping 3.x and servlet
- iOS线程开发之--BLOCK & GCD(Grand Central Dispatch)
- WCF简单教程(1) 入门
- HibernateTemplate源码
- orade中插入大数据类型BLob
- readlink
- Objective-C与Objective-C++的混用代码示例
- rvm安装报错
- Windows下Oracle 10G Client安装
- 浅析Android 4.0的通知系统(附Android 4.0设计指南全文翻译)
- mysql多行多列合并为一行一列