一、什么是WCF:
Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,也可以说是一套软件开发包。WCF合并了Web服务、.net Remoting、消息队列和Enterprise Services的功能并集成在Visual
Studio中。WCF专门用于面向服务开发。
WCF的最终目标是通过进程或不同的系统、通过本地网络或是通过Internet收发客户和服务之间的消息。并为服务提供直接的支持。托管、安全、事务管理、离线对立等等。
椭圆里面是若干服务器,会通过internet传输,服务都会提供一个对外的接口。
二、WebService和WCf的区别
(1)Web Service:严格来说是行业标准,也就是Web Service 规范,也称作WS-*规范,既不是框架,也不是技术。
(2)WCF:WCF 是一个分布式应用的开发框架,属于特定的技术,或者平台。既不是标准也不是规范。
(3)WCF 是一套框架,用来创建各种服务。其中包括创建 Web服务(采用 basicHttpBinding绑定的服务就是一个Web 服务)。
三、新建一个项目
有两个默认的,一个是接口,一个是类文件,在接口上面有【ServiceContract】,在上面定义非常的灵活。便于以后的重构。【PerationContract】操作契约。【DataContact】数据契约。下面的类继承接口。直接将两个文件删除即可。
(1)首先创建一个类库
(2)添加引用,找到ServiceModel,点击添加
(3)将自动生成的类文件删除,然后添加一个接口,命名为IHelloService代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.ServiceModel; namespace HelloService { /// <summary> /// //定义服务契约 /// </summary> [ServiceContract] public interface IHelloService { //添加操作契约,如果不添加的话访问这个服务访问不到sayHello方法 /// <summary> /// 服务操作 /// </summary> /// <param name="name"></param> /// <returns></returns> [OperationContract] string SayHello(string name); } }
(4)添加实现接口的类HelloService,定义SayHello方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.ServiceModel; namespace HelloService { public class HelloService:IHelloService { /// <summary> /// 打招呼 /// </summary> /// <param name="name"></param> /// <returns></returns> public string SayHello(string name) { return name + ":你好!"; } } }
(5)创建宿主程序。地址+绑定+契约=终结点。选择iis作为宿主,必须是http,作为通信协议绑定,如果使用自定义的必须根据绑定协议。 创建一个控制台应用程序,命名为HelloServiceHost
(6)添加ServiceModel引用,和HelloService引用。并在Program类文件中写入
(7)编写Program类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.ServiceModel; using System.ServiceModel.Channels; namespace HelloServiceHost { class Program { static void Main(string[] args) { using (MyHelloHost Host=new MyHelloHost()) { Host.open(); Console.Read(); } } } public class MyHelloHost : IDisposable { /// <summary> /// 定义一个服务对象 /// </summary> private ServiceHost _myhost; public ServiceHost Myhost { get { return _myhost; } } /// <summary> /// 定义一个基地址 /// </summary> public const string BaseAddress = "net.pipe://localhost"; /// <summary> /// 可选地址 /// </summary> public const string HelloServiceAddress = "Hello"; //3、服务契约实现类型 public static readonly Type ServiceType = typeof(HelloService.HelloService);//必须引用HelloService //服务契约接口 public static readonly Type ContractType = typeof(HelloService.IHelloService); /// <summary> ///4、定义一个服务绑定 /// </summary> public static readonly Binding hellobinding = new NetNamedPipeBinding(); /// <summary> /// 5、构造服务对象 /// </summary> protected void CreateHelloServiceHost() { //创建服务对象 _myhost = new ServiceHost(ServiceType, new Uri[] { new Uri(BaseAddress) }); //6、添加终结点 _myhost.AddServiceEndpoint(ContractType,hellobinding,HelloServiceAddress); } /// <summary> /// 7、打开服务方法 /// </summary> public void open() { Console.WriteLine("开始启动服务···"); _myhost.Open(); Console.WriteLine("服务已经启动···"); } /// <summary> /// 8、创建构造方法 /// </summary> public MyHelloHost() { CreateHelloServiceHost(); } /// <summary> /// 关闭服务后,销毁服务宿主实例对象 /// </summary> public void Dispose() { if (_myhost!=null) { (_myhost as IDisposable).Dispose(); } } } }
(8)运行结果
创建客户端:
(1)继续创建控制台应用程序命名为HelloService(记得添加引用),编写代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.ServiceModel; using HelloService; using System.ServiceModel.Channels; namespace HelloClient { class Program { static void Main(string[] args) { using (HelloProxy proxy = new HelloProxy()) { //利用代理调用服务 Console.WriteLine(proxy.Say("帅哥")); Console.Read(); } } //硬编码定义服务契约 [ServiceContract] interface IService { //服务操作 [OperationContract] String Say(String name); } /// <summary> /// 客户端代理类;ClientBase 是用于创建可调用服务的客户端对象,是一种泛型,里面要包括服务端的接口;IService 接口要实现客户端创建的硬编码定义服务企业的接口。 /// </summary> class HelloProxy : ClientBase<IHelloService>, IService { /// <summary> /// 硬编码定义绑定 /// </summary> public static readonly Binding HelloBinding = new NetNamedPipeBinding(); //硬编码定义地址 public static readonly EndpointAddress HelloAddress = new EndpointAddress(new Uri("net.pipe://localhost/Hello")); /// <summary> /// 构造方法 /// </summary> public HelloProxy() : base(HelloBinding, HelloAddress) { } //调用服务端方法 public String Say(String name) { //使用Channel属性对服务进行调用,获取 return Channel.SayHello(name); } } } }
(2)打开HelloServiceHost的exe文件。在bin文件中。然后运行HelloClien中exe文件,结果:
文件格式:
小结:
刚开始接触WCF,对里面的东西理解的还不是很深刻,但是通过这个例子让我对WCF有了宏观的把控。