WCF学习笔记之重载

转载自 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 IHello
11     {
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:IHello
11     {
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 IHello
11     {
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>,IHello
11     {
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 }

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

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页