WCF学习笔记之重载

来源:互联网 发布:linux 网络服务器 编辑:程序博客网 时间:2024/06/05 01:59

转载自 http://www.cnblogs.com/xyz168/archive/2011/11/15/2249505.html 

本节内容:1.什么是重载?2.WCF服务端处理重载。3.WCF客户端处理重载

一、什么是重载?

  重载指的是在同一个类,接口或结构中包含多个同名的方法,而这些方法的参数列表或返回值不同。正常的做法如下所示:

View Code
1         public string Say(string lastName)2         {  3             return "Hello " + lastName;4         }5 6         public string Say(string firstName, string lastName)7         {8              return "Hello " + firstName + "" + lastName;9         }

在WCF中的重载是否不一样呢?

二、WCF服务端的处理重载。

在WCF中需要为服务操作指定唯一名称,需要用到:OperationContract的Name属性如下所示,如果去掉Name属性,会有异常,可以自己动手实验一下。

契约:

View Code
 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5  6 using System.ServiceModel; 7 namespace y.WcfServiceContract.OverloadHost.Services 8 { 9     [ServiceContract]10     public interface IHello11     {12         [OperationContract(Name="SayLastName")]13         string Say(string lastName);14 15         [OperationContract(Name = "SayFullName")]16         string Say(string firstName, string lastName);17     }18 }

服务类:

View Code
 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5  6 using System.ServiceModel; 7 namespace y.WcfServiceContract.OverloadHost.Services 8 { 9     [ServiceBehavior]10     public class HelloService:IHello11     {12         [OperationBehavior]13         public string Say(string lastName)14         {15             Console.WriteLine("Riceive  from client :{0}", lastName);16             return "Hello " + lastName;17         }18 19         [OperationBehavior]20         public string Say(string firstName, string lastName)21         {22             Console.WriteLine("Riceive from client:{0},{1}", firstName, lastName);23             return "Hello " + firstName + "" + lastName;24         }25     }26 }

允许客户端以元数据的形式的获取代理类,对其配置文件如下:

View Code
 1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3   <system.serviceModel> 4     <behaviors> 5       <serviceBehaviors> 6         <behavior name="metadataBehavior"> 7           <serviceMetadata /> 8         </behavior> 9       </serviceBehaviors>10     </behaviors>11     <services>12       <service name="y.WcfServiceContract.OverloadHost.Services.HelloService" behaviorConfiguration="metadataBehavior">13         <host>14           <baseAddresses>15             <add baseAddress="net.tcp://localHost:6666/"/>16           </baseAddresses>17         </host>18         <endpoint address="Hello"19                    binding="netTcpBinding"20                    contract="y.WcfServiceContract.OverloadHost.Services.IHello"></endpoint>21         <endpoint address="MEX"22                    binding="mexTcpBinding"23                    contract="IMetadataExchange"></endpoint>24       </service>25     </services>26   </system.serviceModel>27 </configuration>

三、WCF客户端处理重载

以两种方式创建代理类看看重载的不同:

1.以元数据方式获取的代理类,产生的Contract 和ClientProxy代码如下:

契约:

View Code

 1     [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] 2     [System.ServiceModel.ServiceContractAttribute(ConfigurationName="MetadataProxys.IHello")] 3     public interface IHello { 4          5         [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHello/SayLastName", ReplyAction="http://tempuri.org/IHello/SayLastNameResponse")] 6         string SayLastName(string lastName); 7          8         [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHello/SayFullName", ReplyAction="http://tempuri.org/IHello/SayFullNameResponse")] 9         string SayFullName(string firstName, string lastName);10     }

ClientProxy:

View Code
 1 [System.Diagnostics.DebuggerStepThroughAttribute()] 2     [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] 3     public partial class HelloClient : System.ServiceModel.ClientBase<y.WcfServiceContract.OverloadWinClient.MetadataProxys.IHello>, y.WcfServiceContract.OverloadWinClient.MetadataProxys.IHello { 4          5         public HelloClient() { 6         } 7          8         public HelloClient(string endpointConfigurationName) :  9                 base(endpointConfigurationName) {10         }11         12         public HelloClient(string endpointConfigurationName, string remoteAddress) : 13                 base(endpointConfigurationName, remoteAddress) {14         }15         16         public HelloClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 17                 base(endpointConfigurationName, remoteAddress) {18         }19         20         public HelloClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 21                 base(binding, remoteAddress) {22         }23         24         public string SayLastName(string lastName) {25             return base.Channel.SayLastName(lastName);26         }27         28         public string SayFullName(string firstName, string lastName) {29             return base.Channel.SayFullName(firstName, lastName);30         }31     }

比较WCF服务端的契约可以看出。现在的代理类方法名称均为,WCF服务中OperationContract指定的Name名称。

2.手动编写代理类,实现重载。

契约,和服务端相同,包括OpertaionContract的Name属性,如下:

View Code

 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5  6 using System.ServiceModel; 7 namespace y.WcfServiceContract.OverloadWinClient.ManualProxy 8 { 9     [ServiceContract]10     public interface IHello11     {12         [OperationContract(Name = "SayLastName")]13         string Say(string lastName);14 15         [OperationContract(Name = "SayFullName")]16         string Say(string firstName, string lastName);17     }18 }

代理类的实现:

View Code
 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5  6 using System.ServiceModel; 7 using System.ServiceModel.Channels; 8 namespace y.WcfServiceContract.OverloadWinClient.ManualProxy 9 {10     public class HelloProxy:ClientBase<IHello>,IHello11     {12         public HelloProxy(string endpointCon)13             : base(endpointCon)14         {15         }16 17         public string Say(string lastName)18         {19             return base.Channel.Say(lastName);20         }21 22         public string Say(string firstName, string lastName)23         {24             return base.Channel.Say(firstName, lastName);25         }26     }27 }

运行服务端,客户端获取的结果如下,说明通信正常。

 

原创粉丝点击