为什么客户端不能直接(!)与WCF服务器通话,而不是使用代理类来执行此操作?

JAN*_*JAN 4 .net c# wcf client-server

我目前正在学习WCF的基础知识,我偶然发现了以下流程:

在此输入图像描述

这意味着我的客户端需要使用与WCF服务器通信的Proxy类.

为什么我(客户端)不能直接与服务器通话,而不是使用第三方来完成工作?

Mic*_*kyD 5

没有什么能阻止你使用ac#WCF代理客户端与WCF服务进行通信,你总是可以不使用并使用原始的TCP/HTTP/pipes/MSMQ.然而,这样做通常需要很多努力和时间 - 在此期间大多数人通常更愿意花时间阅读Hitchhiker的银河指南.

重?

WCF代理实际上没有听起来那么重.他们也不是真正的"第三方".通常只有与您的应用程序一起编译的轻量级类别.在某些COM场景中,它们不会像在进程外那样运行.

"第三方"代理的概念并非WCF独有.DCOM也有代理的概念,但与WCF不同,它们是在幕后为您创建的,无法避免.有时,如上所述,他们甚至在另一个过程中运行!WCF,或者我应该说SOAP服务(通常)与DCOM不同,因为客户端代理不是必需的.他们只是让使用SOAP服务的使用情况更容易.幸运的是,Windows的那部分必须为超空间旁路让路,因此在当代应用中使用DCOM基本上不再存在.

客户代理通过以下方式帮助您的生活:

  • 方法调用封装并序列化为请求消息(通常为SOAP)

  • 当对服务的调用从前一步骤发送请求消息时,从底层传输中抽象出来.即使用TCP; HTTP; MSMQ等API.希望您的TCP WCF服务接受本地命名管道客户端?只需更改配置文件,通常不需要更改代码!

  • 响应消息反序列化为用户友好的c#对象

  • 处理所有繁琐的; 以安全令牌的形式为您提供复杂且必要的安全保障; 饼干等

什么时候WCF不是WCF?

所以再回到你的问题:

为什么客户端不能直接(!)与WCF服务器通话,而不是使用代理类来执行此操作?

...当您考虑WCF将所有comms API统一到单个API中时; 抽象并封装SOAP服务,然后我们可以说所有WCF客户端都按照定义使用WCF代理与WCF服务进行通信.

一旦客户端明确使用原始 TCP; MSMQ; HTTP; 在代码中命名管道API,它基本上不再是WCF客户端(记住WCF是关于统一通信的),而是成为SOAP客户端(或者可能是REST).我甚至认为使用IRequestChannel接口及其Request()方法会引入一种消息传递概念,这种概念在标准WCF客户端代理代码中并不明显(即使它仍然从用户抽象传输).通过比较,如果我将MSMQ绑定添加到我的纯WCF-client-proxy-using-app的WCF配置,我的代码通常不会采用通常与MSMQ相关联的异步消息传递模型.这是WCF的好处.

当然,用WCF编写的服务器将非常满足于它认为自己是"WCF"的知识,无论客户是否认为它是WCF; 通过TCP拍摄的 SOAP或一些可怕的XML有效载荷冥王星的神灵大致相同,认为自己是一个行星,无论当时的分类系统是什么样的.

  • 如果要将服务视为WCF服务 - 请使用WCF客户端代理(因为我们通常不关心正在发送的基础SOAP消息)

  • 如果您想在没有代理的情况下直接与服务进行通信,那么您应该将远程服务视为SOAP服务,因此不仅要使用低级别的通信API,还要考虑如何构造和处理SOAP消息.

是否建议使用非代理方法?

虽然你可以不使用代理,但推荐使用,因为如果你想改变安全性,传输,最大消息长度,JSON等协议,添加async方法,你需要对你的非执行大量代码更改. proxy-using-app与代理方法相比较.

就像星舰之心Heart of Gold一样,WCF "很高兴为提供服务",但是如果您想要手动掌舵控制,那就明白了.


毫无根据地提到道格拉斯·亚当的精彩广播剧; 电视迷你系列和书籍银河系漫游指南.为什么不按下Do not Panic按钮并立即阅读?