重载是面向对象编程里面比较常见的一个问题,如下:
interface ICalculator
{int Add(int a, int b);double Add(double a, double b);
}

通过不同的参数列表,给出不一样的函数签名。但是在WCF通过interface公开服务契约的时候,有这样一个问题。直接在这2个Add方法上添加[OperationContract]会导致异常发生。
我们来创建一个例子,服务端代码:
interface ICalculator
{[OperationContract]int Add(int a, int b);[OperationContract]double Add(double a, double b);
}........static void Main(string[] args)
{try{ServiceHost host = new ServiceHost(typeof(Calculator));Binding wsHttpBinding = new WSHttpBinding();host.AddServiceEndpoint(typeof(ICalculator), wsHttpBinding, new Uri("http://localhost:8086/Calculator/"));host.Open();}catch (Exception ex){Console.WriteLine(ex.ToString());}Console.Read();
}

在启动self-host的时候遇到如下的异常信息:
System.InvalidOperationException: Cannot have two operations in the same contract with the same name, methods Add and Add in type Server.ICalculator violate this rule. You can change the name of one of the operations by changing the method name or by using the Name property of OperationContractAttribute.

原因在于,基于wsdl的方法是不支持重载的,方法名是唯一的标识。WCF提供了一个解决方法,就是给[OperationContract]一个name属性。
[ServiceContract]
interface ICalculator
{[OperationContract(Name="AddInt")]int Add(int a, int b);[OperationContract(Name="AddDouble")]double Add(double a, double b);
}

重新启动self-host以后,异常不再出现。从客户端角度来看,如果以channel的方式调用:
static void Main(string[] args)
{Binding binding = new WSHttpBinding();EndpointAddress address = new EndpointAddress("http://localhost:8086/Calculator/");ICalculator proxy = ChannelFactory<ICalculator>.CreateChannel(binding, address);using (proxy as IDisposable){Console.WriteLine(proxy.Add(1, 2));Console.WriteLine(proxy.Add(1.0, 2.0));}Console.Read();
}

因为是引用了ICalculator接口,客户端也支持了面向对象语言的重载特性。但如果使用的自动生成的proxy类,会生成类似如下的类定义:
[ServiceContract]
interface ICalculator
{[OperationContract]int AddInt(int a, int b);[OperationContract]double AddDouble(double a, double b);
}public partial class CalculatorClient : ClientBase<ICalculator>, ICalculator
{public int AddInt(int a, int b){return Channel.AddInt(a, b);}public int AddDouble(double a, double b){return Channel.AddDouble(a, b);}
}
.....

为了让代理类也支持重载特性,可以手工的修改代理:
[ServiceContract]
interface ICalculator
{[OperationContract(Name="AddInt")]int Add(int a, int b);[OperationContract(Name="AddDouble")]double Add(double a, double b);
}public partial class CalculatorClient : ClientBase<ICalculator>, ICalculator
{public int Add(int a, int b){return Channel.Add(a, b);}public int Add(double a, double b){return Channel.Add(a, b);}
}
.....

然后我们在调用代理类的时候,可以同使用channel一样,使用重载特性啦。。。。
CalculatorClient proxy = new CalculatorClient ();
Console.WriteLine(proxy.Add(1, 2));
Console.WriteLine(proxy.Add(1.0, 2.0));
proxy.Close();

转载于:https://www.cnblogs.com/milkman-nuaa/archive/2009/12/23/1630311.html

WCF热带鱼书学习手记 - Service Contract Overload相关推荐

  1. WCF热带鱼书学习手记 - ABC

    WCF的基本要点总结一下可以缩略为ABC: 1. A - Address (服务在哪里) 2. B - Binding (怎么才能访问服务呀?) 3. C - Contract (提供了哪些服务?) ...

  2. 我的WCF之旅(7):面向服务架构(SOA)和面向对象编程(OOP)的结合——如何实现Service Contract的继承...

    当今的IT领域,SOA已经成为了一个非常时髦的词,对SOA风靡的程度已经让很多人对SOA,对面向服务产生误解.其中很大一部分人甚至认为面向服务将是面向对象的终结,现在的面向对象将会被面向服务完全代替. ...

  3. WCF把书读薄(4)——事务编程与可靠会话

    WCF把书读薄(3)--数据契约.消息契约与错误契约 真不愧是老A的书,例子多,而且也讲了不少原理方面的内容,不过越读越觉得压力山大--这次来稍微整理整理事务和可靠会话的内容. 十八.事务编程 WCF ...

  4. WCF服务编程 学习笔记(1)

    你或许可以使用某一技术实现某些功能,可以按着指定的要求,完成特定的功能,实现某一想要的效果,这表示你可以使用该技术,会使用该技术,但是我们不能停留在使用的层次上,还要了解它们的运行机制,可能有点深了, ...

  5. ROS学习手记 - 5 理解ROS中的基本概念_Services and Parameters

    ROS学习手记 - 5 理解ROS中的基本概念_Services and Parameters 上一节完成了对nodes, Topic的理解,再深入一步: Services and Parameter ...

  6. AM335X的汇编语言与c语言,X86汇编语言学习手记 -- 汇编和C协同

    X86汇编语言学习手记(3) 2004年12月 在X86汇编语言学习手记(1)(2)中,可以看到栈(Stack)作为进程执行过程中数据的临时存储区域,通常包含如下几类数据: 局部变量 函数调用的返回地 ...

  7. webpack入门学习手记(一)

    本人微信公众号:前端修炼之路,欢迎关注. 之前用过gulp.grunt,但是一直没有学习过webpack.这两天刚好有时间,学习了下webpack.webpack要想深入研究,配置的东西比较多,网上的 ...

  8. ROS学习手记 - 2.1: Create and Build ROS Package 生成包(Python)

    ROS学习手记 - 2.1: Create and Build ROS Package 生成包(Python) ROS学习手记 - 2.1: Create and Build ROS Package ...

  9. 西瓜书学习记录-神经网络(第五章)

    西瓜书学习记录-神经网络(第五章) 第五章啦,大佬的视频没讲第五章,所以看书自学一下: 书籍来自周志华的<机器学习>.

最新文章

  1. 关闭图片 pycharm_博士大佬总结的Pycharm 常用快捷键思维导图,收藏!
  2. Missing message for key xxx in bundle (default bundle) for locale zh_CN
  3. 红外感应自动出水水龙头的电路原理
  4. 【图像分类】 关于图像分类中类别不平衡那些事
  5. 纪念中学15-5(=10)天感想
  6. Wise Package Studio介绍
  7. 【HDU 2222】Keywords Search
  8. Struts框架的核心业务
  9. http请求头中包含未编码中文时webapi self host崩溃
  10. 第十五周项目2 - 大数据集上排序算法性能的体验
  11. word文档打不开、损坏了怎么修复
  12. 微信开发者工具命令面版
  13. Excel学习之旅(三)
  14. 安卓开发自己写的刻度尺测量,精确到mm.
  15. matlab 端点检测 能零比法_基于短时能量与过零率的端点检测的matlab分析
  16. 移动端音视频从零到上手
  17. ORACLE+SQL性能优化
  18. 解决错误 Could not find method leftShift() for arguments
  19. B站粉丝数显示器代码解析学习
  20. LaTex “too many unprocessed floats” (过多未处理的浮动)错误的解决方法

热门文章

  1. linux内存占满但是无进程,为什么TOP看不出真实的内存占用情况?
  2. PHP随机配菜_PHP+JS三级菜单联动菜单实现方法
  3. zookeeper安装_Linux下安装zookeeper
  4. 笔记本电脑锁_联想都不敢想之2020年笔记本电脑推荐
  5. BZOJ 5267 特工 (类FWT)
  6. htpasswd java_mod_rewrite,reverseProxy和.Htpasswd
  7. 伺服电机常用参数设置_6个步骤教你如何快速调试伺服电机
  8. java foreach标签,jstl c:foreach标签
  9. .Net 多线程 异步编程 Await、Async和Task
  10. safehandle 和析构函数