WCF 服务编程学习笔记.doc_第1页
WCF 服务编程学习笔记.doc_第2页
WCF 服务编程学习笔记.doc_第3页
WCF 服务编程学习笔记.doc_第4页
WCF 服务编程学习笔记.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

WCF 服务编程学习笔记1. 地址:HTTP/HTTPSl 格式:http:/localhost:8001/MyServicel 默认端口是HTTP是80,HTTPS是43TCPl 格式:net.tcp:/localhost:8001/MyServicl 默认端口:808IPC(进程通信,只能在本机调用)l 格式:net.ipc:/localhost/MyPipel 默认端口:无MSMQ(消息队列,如果处理私有队列,则必须指定队列类型)l 格式:net.msmq:/localhost/private/MyService(私有)net.msmq:/localhost/MyService (公有)Service Bus(Windows Azure AppFabric服务总线使用sb、http或https作为传输协议,而且服务总线地址必须包含服务命名空间)l 格式:sb:/MyN/2. 契约服务契约(ServiceContract)l 描述:服务契约描述了暴露给外部的类型(接口或类)、服务所支持的操作、使用的消息交换模式和消息的格式。每个WCF服务必须实现至少一个服务契约。使用服务契约必须要引用命名空间System.ServiceModel 。服务契约中常用到的三个特性:1) ServiceContractAttribute:该特性定义在类或接口上,用来描述一个相关操作的集合。ServiceContractAttribute特性还有如下的一些属性值可以设置:Name:给服务契约定义一个名称,而不是使用接口或是类的类型名,在客户端添加服务引用时会用到。Namespace:命名空间,默认值为。CallbackContract:获取或设置协定说明指定的回调协定的类型(将另一个服务契约定义为回调契约,使得客户端可以接收服务端的异步消息)。ProtectionLevel:控制契约中发送给消息的保护方式是否需要被签名和加密,该属性为System.Net.Security.ProtectionLevel枚举类型。SessionMode:确定会话是否为公开服务契约的端点所支持。ConfigurationName:服务的配置名称。例:ServiceContract(Name=HelloWorld,Namespace=http:/ public interface IHelloWorldService 2) OperationContractAttribute:用OperationContractAttribute标记的方法即为一个服务操作,简单的使用该特性就可以让一个方法加入到服务契约的操作队列中,可以被客户端所调用。该特性也有一些设置消息交换方式的属性。如下Name:定义一个操作名称,而不是使用方法名称。Action:该操作消息的动作标题。ReplyAction:响应该操作消息的动作标题。IsOneWay:设置该操作是否单向和没有回复(异步调用),如果操作是单向的,将不支持ReplyAction。ProtectionLevel:允许你控制特定的操作消息是否被保护,操作中的ProtectionLevel属性将覆盖服务契约中的ProtectionLevel。该属性为System.Net.Security.ProtectionLevel枚举类型。IsInitiating:操作是否可以用来初始化会话。IsTerminating:操作是否中止一个会话。AsyncPattern:将服务操作定义为异步实现模式。例:ServiceContract( Namespace = , Name = oec2003, ConfigurationName = IHelloWorldService ) public interface IHelloWorldService OperationContract(Name=oec2003SayHello,Action=/IHelloWorldService,ReplyAction=/IHelloWorldService/HelloReply ) string SayHello();3) MessageParameterAttribute使用 MessageParameterAttribute 可以控制参数或返回值的名称。此属性对于已用 MessageContractAttribute 特性标记的参数无效。该特性只有一个Name属性,看如下代码:ServiceContract(Namespace=,Name=oec2003, ConfigurationName=IHelloWorldService)public interface IHelloWorldService OperationContractreturn: MessageParameter(Name = responseString)string SayHello(MessageParameter(Name = string) string meg); 数据契约(DataContract)l 描述:定义与服务交互的数据类型,使用数据契约必须引用System.Runtime.Serialization命名空间,在类型上使用DataContractAttribute可以创建数据契约,类型中的成员使用DataMember标记。1) DataContractAttribute:DataContractAttribute特性定义在类型之上,类型包括类、结构、枚举但不包括接口。DataContractAttribute特性不能被继承,即继承自有DataContractAttribute特性标记的类并不是数据契约,必须显示使用DataContractAttribute标记才能成为数据契约。DataContractAttribute特性有IsReference、Name和Namespace三个属性:IsReference:bool类型,表示在进行序列化的时候是否保持对象现有的引用结构。Name:名称。Namespace:命名空间。例:DataContract(IsReference=true,Name=MyUser,Namespace=) public class User DataMemberpublic int Age get; set; DataMember public string Name get; set; DataMember public string Email get; set; 2) DataMemberAttribute:DataMemberAttribute标记的类型成员才能成为数据契约的数据成员。这个和服务契约中的OperationContractAttribute类似。DataMemberAttribute特性有如下四个属性:EmitDefaultValue:表明在数据成员的值等于默认值的情况下,是否还须要将其序列化到最终的XML中,默认值为true,表示默认值会参与序列化。IsRequired:bool类型,表明属性成员是否是必须的成员,默认值为false。Name:数据成员的别名。Order:相应的数据成员在最终序列化的XML中出现的位置,默认是按字母顺序排列的。例:DataContract(IsReference=true,Name=MyUser,Namespace=http:/ ) public class User DataMember(EmitDefaultValue=true,IsRequired=true, Name=Oec2003_Age,Order=1)public int Age get; set; DataMember(EmitDefaultValue = true, IsRequired = true, Name = Oec2003_Name, Order = 2)public string Name get; set; DataMember(EmitDefaultValue = true, IsRequired = false, Name = Oec2003_Email, Order = 3) public string Email get; set; 错误契约(FualtContract)l 描述:定义服务抛出的异常,以及服务处理错误和传递错误到客户端的方式。消息契约(MessageContract)l 描述:允许服务直接与消息交互,可以是类型化的,也可以是非类型化的。倘若消息交互的另一端规定了某些显式(通常是专用)的消息格式,在这种情况下,消息契约将非常有用。不见意使用,会增加开发的复杂程度。使用消息契约必须引用System.ServiceModel命名空间,消息契约和数据契约一样都是定义在数据类型上。和数据契约不同的是消息契约更多的是关注数据成员在SOAP消息中的表示。定义一个消息契约需要用到MessageContractAttribute特性,另外还涉及到MessageHeaderAttribute和MessageBodyMemberAttribute这两个特性,MessageContractAttribute特性标记在类型上,MessageHeaderAttribute和MessageBodyMemberAttribute特性标记在数据成员上。1) MessageContractAttribute通过在一个类型上使用MessageContractAttribute标记可以使之成为一个消息契约。MessageContractAttribute特性含有如下几个属性:IsWrapped:是否为定义的主体成员(一个或者多个)添加一个额外的根节点。WrapperName:根节点的名称。WrapperNamespace:根节点的命名空间。ProtectionLevel:表示保护级别,WCF中通过System.Net.Security.ProtectionLevel枚举定义消息的保护级别。一般有3种可选的保护级别:None、Sign和EncryptAndSign。例:MessageContract(IsWrapped=false,WrapperName=MyMessage, WrapperNamespace=) public class MessageTest /省略 2) MessageHeaderAttribute:使用MessageHeaderAttribute标记的数据成员将会出现在SOAP消息的头部,该特性包含下面几个属性:Actor:为一个URI值,表示处理该报头的目标节点。MustUnderstand:bool类型,表明Actor定义的节点是否必须理解并处理该节点。Name:名称。Namespace:命名空间。ProtectionLevel:表示保护级别。Relay:表明该报头是否需要传递到下一个SOAP节点。例:MessageContract public class MessageTest MessageHeader(Actor=/Age,MustUnderstand=true,Name=MyAge,Namespace=,Relay=true) public int Age get; set; MessageHeader public string Name get; set; 3) MessageBodyMemberAttribute:使用MessageHeaderAttribute标记的数据成员将会出现在SOAP消息的主体部分,该特性包含下面的属性:Order:Order属性用来控制成员在SOAP主体部分中出现的位置,默认按字母顺序排列。Name:名称。Namespace:命名空间。ProtectionLevel:表示保护级别。例:MessageContract(IsWrapped=false,WrapperName=MyMessage, WrapperNamespace=) public class MessageTest MessageBodyMember(Order = 1) public string Email get; set; 注意:WCF允许将ServiceContract属性标记到服务类上,而不需要首先定义一个单独契约,但应该尽量避免将此属性直接标记到服务类上,应该定义一个单独的契约(接口),这样有利于在不同的场景下使用契约。3. 行为(Behaviors)服务行为(Service Behavior):l 描述:基于服务本身的行为,实现了接口System.ServiceModel. Description.IServiceBehavior,可以通过自定义特性(Attribute)或配置的方式进行指定。终结点行为(Endpoint Behavior):l 描 述:基于某个服务终结点(客户端或者服务端)的行为,实现了接口System.ServiceModel.Description.IEndpointBehavior,可以通过配置的方式进行指定。契约行为(Contract Behavior):l 描 述:基于某个服务契约的行为,作用于实现了该契约的所有服务(服务端行为)和基于该契约进行服务调用的服务代理(客户端行为),实现了接口System.ServiceModel.Description.IContractBehavior,可以通过自定义特性(Attribute)的方式进行指定。操作行为(Operation Behavior):l 描 述:基于服务中的某个操作,可以通过自定义特性的方式将操作行为应用于服务契约的某一个操作契约上,也可以直接应用于服务的操作方法上。4. 托管IIS托管描述:以IIS为宿主进行托管。自定义托管描述:以Console、WPF、WinForm等程序进行托管,用到类ServiceHost类。5. 绑定6. 回调(Callback)回调是由服务端来调用客户端的方法,回调时原先的服务端和客户端将发生对调,服务端成为客户端,客户端成为服务端。说白了就是在原有基础上,为客户端也添加一个服务端点,让服务器能调用这个客户端 服务,从而实现所谓的回调机制。WCF回调的必要条件:l 描 述:并不是所有的绑定都支持回调操作,只有具有双向通信能力的绑定才可以使用回调。比如HTTP是与连接无关的因此不能用于回调。这就说明我们不能使用BasicHttpBinding或WSHttpBinding进行回调。WCF中NetTcpBinding和NetNamedPipeBinding支持回调,因为从本质上讲TCP和IPC协议支持双向通信。WCF中wsDualHttpBinding也是支持回调的因为它实际上是设置了两个HTTP通道。定义回调契约:l 描 述:一个服务契约若要定义回调,必须专门定义一个用于回调的契约。一个服务契约最多包含一个回调契约,一个服务契约一旦定义了回调契约那客户端必须支持这个回调。那如何为一个服务契约定义回调呢?使用ServiceContract特性的CallBackContract特性,下面通过代码实例说明:ServiceContract(SessionMode=SessionMode.Required, CallbackContract = typeof(ISomeCallbackContract) public interface IService1 OperationContract(IsOneWay=true) void DoSomething(); /用于回调的契约interface ISomeCallbackContract OperationContract(IsOneWay=true)void SomeCallbackMethod(); OperationContract(IsOneWay = true)void SomeCallbackMethod2();客户端回调设置:l 描 述: 客户端需要实现服务端定义的那个用于回调的契约ISomeCallbackContract,然后实例化回调对象再通过它创建一个上下文对象InstanceContext。然后用代理把这个回调的引用传回服务端下面通过代码实例说明:ServiceContract(SessionMode=SessionMode.Required, CallbackContract = typeof(ISomeCallbackContract) public interface IService1 OperationContract(IsOneWay=true) void DoSomething(); /用于回调的契约interface ISomeCallbackContract OperationContract(IsOneWay=true)void SomeCallbackMethod(); OperationContract(IsOneWay = true)void SomeCallbackMethod2();实现服务的类:ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Reentrant)public class Service1 : IService1static List m_Callbacks = new List(); public void DoSomething() / 获得由客户端传入的回调终结点的引用,使用这个引用可以调用客户端方法ISomeCallbackContract callback = OperationContext.Current.GetCallbackChannel();if (m_Callbacks.Contains(callback) = false)m_Callbacks.Add(callback);Trace.WriteLine(DoSomething);/ 调用客户端实现的SomeCallbackMethod2方法,callback.SomeCallbackMethod2();CallClients();static public void CallClients()Action invoke = delegate(ISomeCallbackContract callback)callback.SomeCallbackMethod();m_Callbacks.ForEach(invoke);客户端代码:/ 客户端实现回调接口,使用VS自动生成代理的时候,对于回调接口的命名默认是以服务契约接口名称+Callback,而不是原先在服务端定义的回调接口的名子public class CallBack : ServiceReferenceCallBack.IService1Callbackpublic void SomeCallbackMethod()MessageBox.Show(SomeCallbackMethod(), MyClient); public void SomeCallbackMethod2()MessageBox.Show(SomeCallbackMethod2(), MyClient);客户端调用:首先生成回调接口实现的对象,然后用这个对象去实例化一个上下文对象context ,在创建客户端代理对象的时候在构造方法中使用这个上下文对象context 就可以把客户端回调对象的引用作为消息的一部分传送到服务端,在服务端就可以通过OperationContext.Current.GetCallbackChannel()来获得这个回调对象的引用,服务端有了这个回调对象的引用就可以去调用客户端实现的回调方法。代码:ServiceReferenceCallBack.IService1Callback callback = new CallBack();InstanceContext context = new InstanceContext(callback);ServiceReferenceCallBack.Service1Client sc = new WCFPrograme.ServiceReferenceCallBack.Service1C

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论