1、什么是WCF
严格的说,WCF就是专门用于服务定制、发布与运行以及消息传递和处理的一组专门类的集合,也就是所谓的“类库”。这些类通过一定方式被组织起来,共同协 作,并为开发者提供了一个统一的编程模式。WCF之所以特殊,是在于它所应对的场景与普通的.NET类库不同,它主要用于处理进程间乃至于机器之间消息的 传递与处理,同时它引入了SOA的设计思想,以服务的方式公布并运行,以方便客户端跨进程和机器对服务进行调用。实际上,WCF就是微软对于分布式处理的 编程技术的集大成者,它将DCOM、Remoting、Web Service、WSE、MSMQ集成在一起,从而降低了分布式系统开发者的学习曲线,并统一了开发标准。
2、WCF服务需要依存一个运行着的进程(宿主),服务寄宿就是为服务指定一个宿主的过程。WCF是一个基于消息的通信框架,采用基于终结点(Endpoint)的通信手段。终结点由地址(Address)、绑定(Binding)和契约(Contract)三要素组成。Address是Endpoint的网络地址,它标记了消息发送的目的地。Binding描述的是如何发送消息,例如消息发送的传输协议(如 TCP,HTTP),安全(如SSL,SOAP消息安全)。Contract则描述的是消息所包含的内容,以及消息的组织和操作方式,例如是单向,双向还 是请求/响应方式。服务寄宿的目的就是开启一个进程,为WCF服务提供一个运行的环境。通过为服务添加一个或多个终结点,使之暴露给潜给的服务消费者。服务消费者最终通过相匹配的终结点对该服务进行调用。我们可以完全通过代码的方式完成所有的服务寄宿工作,也可以在配置文件中配置。项目中一般都会使用配置文件进行管理。
<?xml version="1.0" encoding="utf-8"?> <!--服务端配置--> <configuration> <system.serviceModel> <services> <service name="WcfService1.Service1"> <host> <baseAddresses> <add baseAddress="http://localhost:8098/Service1"/> </baseAddresses> </host> <endpoint address="" binding="wsHttpBinding" contract="WcfService1.IService1"></endpoint> </service> </services> <behaviors> <serviceBehaviors> <behavior> <serviceMetadata httpGetEnabled="True"/> <serviceDebug includeExceptionDetailInFaults="False"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration> <!--客户端配置--> <!--<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <bindings> <wsHttpBinding> <binding name="WSHttpBinding_IService1" /> </wsHttpBinding> </bindings> <client> <endpoint address="http://localhost:8098/Service1" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService1" contract="ServiceReference1.IService1" name="WSHttpBinding_IService1"> <identity> <userPrincipalName value="lining@shanghai3h.com" /> </identity> </endpoint> </client> </system.serviceModel> </configuration>-->
static void Main(string[] args) { //创建宿主的基地址 Uri baseAddress = new Uri("http://localhost:8098/Service1"); //创建宿主 using (ServiceHost host = new ServiceHost(typeof(Service1), baseAddress)) { //向宿主中添加终结点 host.AddServiceEndpoint(typeof(IService1), new WSHttpBinding(), ""); //将HttpGetEnabled属性设置为true ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; //将行为添加到Behaviors中 host.Description.Behaviors.Add(smb); //打开宿主 host.Open(); Console.WriteLine("WCF中的HTTP监听已启动...."); Console.ReadLine(); host.Close(); } }
3、WCF的典型宿主包括以下四种:
(1)、"Self-Hosting" in a Managed Application(自托管宿主)(2)、Managed Windows Services(Windows Services宿主)(3)、Internet Information Services(IIS宿主)(4)、Windows Process Activation Service(WAS宿主)
4、我做的小程序就是按照网上的例子(我的第一个WCF程序)做的,例子很简单,可能需要注意一下几点:
(1)、含有WCF服务的程序在运行时会报错(权限不足),这时候需要以管理员方式运行
(2)、常用的序列化和反序列化有三种:XML、Binary、Soap,它的作用主要是为了在进程或机器间进行数据的传递与交互
(3)、WCF中被[DataMember]修饰的属性必须同时具备get和set方法
(4)、XmlSerializer类在System.Xml命名空间下,这个类可以系列化那些即使没有添加[Serializable]特性的类型
(5)、配置文件中address="http://localhost:8098/Service1"的端口号 与 wcf服务属性中特定端口必须不同!!