WCF是基于套接字构建的

Is WCF built on sockets?

本文关键字:构建 套接字 WCF      更新时间:2023-10-16

我正在尝试更详细地理解使用套接字编程,而不仅仅是使用API调用。我对C++中使用WinSocks进行C#WCF和套接字编程有相当的了解。现在我有两个主要问题:

  1. WCF是否在所有情况下都在内部使用套接字进行通信。换句话说,WCF是围绕套接字的包装器吗
  2. 是否所有基于网络的通信都在末端使用套接字来发送/接收数据,这是OSI模型强制要求的

一点详细的解释会比只回答"是/否"更好。

(确认同意重新打开此问题的其他SO用户)。

作为开场白,请记住,现在是

20192020,WCF已经过时,我个人很高兴看到它消失了,我强烈建议不要在任何新项目中使用WCF,我建议人们尽快退出WCF。

现在,在回答你的问题(我的重点是粗体):

WCF是否在所有情况下都在内部使用套接字进行通信。换句话说,WCF是围绕套接字的包装器吗?

严格来说,(但在实际意义上,对于机器间传输,)。


WCF是一个.NET平台;消息处理";。WCF试图抽象出消息传输的底层细节(但它做得太可怕了,所以今天没有人应该使用它),因此完全有可能构建一个WCF应用程序,在不使用Windows的Winsock或任何";插座"-式API可用于给定的计算平台。

现在,虽然表面上WCF都是抽象的,但实际上WCF是围绕SOAP消息的(SOAP也很可怕,但这是另一个讨论),SOAP主要使用HTTP作为消息传输,HTTP主要使用TCP/IP,Microsoft Windows上的几乎每一个TCP/IP应用程序都将在进程通信堆栈中的某个位置使用Winsock API。(可以说,Windows上的HTTP应用程序将使用在内核模式中执行HTTP请求/响应处理的http.sys,这必然意味着绕过Windows的用户模式Winsock API,而http.sys使用"Winsock内核",这是它自己的东西)。

在上面的段落中,注意单词";主要是";(与"独占"或"始终"相反)-因为:

  • WCF不必使用SOAP,它可以使用其他消息传递模型/协议/范式,如net.tcp(它本身更像是"二进制SOAP"),甚至REST(尽管REST支持在WCF的使用寿命后期才出现,正确配置是一件非常困难的事,YMMV)
  • SOAP不必使用HTTP,它可以使用其他传输,如SMTP。WCF明确支持其他SOAP的其他主要传输,如SMTP和FTP
  • 虽然HTTP有效地与TCP/IP绑定,并且Winsock是用户模式应用程序使用TCP/IP的唯一真实方式,但其他传输(如SMTP)不必使用TCP/IP(至少,不是你认为的方式-请参阅我的脚注)
  • 当然,在所有这一切中,除了Winsock或BSD套接字之外,用户模式应用程序总是可以自由使用不同的网络编程接口(例如,Windows的命名管道提供了流式IPC接口,就像TCP的行为一样),或者网络接口卡的供应商可以拥有自己的专门网络API,这在某种程度上比套接字API更好(类似于20世纪90年代中期GPU供应商推出自己的API(Glide、PowerVR、Rendition等),直到他们都不得不支持Direct3D和OpenGL(谁使用Metal?哈哈)
  • 虽然WCF在设计时并没有完全考虑到可测试性,但仍然可以在集成测试环境中托管和运行WCF应用程序,在该环境中,实际的消息传输只是一个精简的代理对象,或者是一个伪造或模拟的实现,因此在那里也完全避免了套接字

但在实践中-在Win32中,网络是使用Winsock(Microsoft的BSD Sockets API实现)实现的,因此如果您使用WCF在机器之间进行通信,那么我可以99%肯定地说,最终您的消息将通过Winsock。

脚注:关于在不使用套接字的情况下将WCF与SMTP一起使用:许多SMTP电子邮件服务器,包括Microsoft Exchange Server,都支持";拾取目录"-这些文件系统目录是由电子邮件服务器主动监控的文件系统目录,它检测新文件何时被添加到文件夹中,并将每个文件读取为SMTP信封,并以与服务器的SMTP服务端点接收的SMTP信封相同的方式处理它——如果在SMTP中的SOAP消息是"SOAP";丢弃";在pickup目录中,并且它的目的地是pickup文件夹的电子邮件服务的本地收件人,那么该消息也根本不会通过Winsock。