本文demo已上传至github:xinyuehtx/WCFdemo

这个博客会介绍如何设置服务操作的调用模式


WCF的服务调用有3种模式:请求答复模式(Request-Repley),单向模式(One-Way),双工模式(Duplex)

请求答复模式

1548303202564

请求答复模式的服务调用方式如如所示,这也是服务的默认行为。

1548316960915

如图所示我们创建了服务协定IRequestResponse,并且定义了方法SayHello和,他们使用OperationContractAttribute的默认构造指定,表明这个方法是请求答复模式。

接着我们完成其余部分。

1548317233972

1548317248284

1548317660812

这个例子和上一篇的HelloWorld并无差别。

但是细心的同学已经发现,请求答复模式的答复去哪儿了?

因为我们的方法是void方法,没有返回值。

现在我们添加另一个方法SayHello2并且返回一个字符串

1548318170453

1548318185658

1548318203769

我们现在尝试将返回值进行输出

1548318227405

结果如图所示

1548318104714

这个时候又有一些细心的小伙伴发现问题了,我们在客户端调用服务的方式是一个同步方法。

那么服务端的计算和通信延迟势必会造成客户端卡顿

默认的WCF通信超时是1min,我们尝试在服务实现中添加延时

1548318581498

1548318756643

好糟心~~那么上面的void方法总没事了吧。我们继续做实验

这次在SayHello这个void方法中添加延时

1548318891613

失败++

1548318958781

小结

我们研究了WCF服务的请求答复模式,其特点有

  • 简单
  • 可以获得返回值
  • 是同步方法,有超时风险

问题解决方案

那么对于那些耗时服务,出现的超时问题该怎么解决呢?

  1. 采用尽量简短的服务计算功能,大量计算任务建议移动至客户端
  2. 对于没有同步执行要求的void方法,可以尝试单向模式
  3. 对于没有同步执行要求的非void方法,可以尝试异步服务

单向模式异步服务可以在之后的博客中进行介绍

参考链接:


本文会经常更新,请阅读原文: https://xinyuehtx.github.io/post/wcf%E5%85%A5%E9%97%A8-3.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名黄腾霄(包含链接: https://xinyuehtx.github.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系