【问题标题】:Is .NET Remoting really deprecated?.NET Remoting 真的被弃用了吗?
【发布时间】:2010-11-20 15:18:47
【问题描述】:

每个人都在说 .NET Remoting 如何被 WCF 取代,但我想知道这到底有多准确。我还没有看到任何官方消息说 Remoting 已被弃用,而且在我看来,在某些情况下,Remoting 肯定比 WCF 更有意义。即使在框架的 4.0 版中,也没有弃用任何与远程处理相关的对象或方法。我也理解3.5和4.0框架中的System.AddIn使用Remoting。

有没有人有任何相反的官方说法?

在文章中,Choosing Communication Options in .NET(对于 3.0,因为那是那篇文章的最新版本),它指出:

8 跨应用域通信

如果您需要支持同一进程内不同应用程序域中的对象之间的通信,则必须使用 .NET 远程处理。

现在,这当然是不准确的,因为 WCF 确实可以用于跨越应用程序域的边界,但它是否给出了针对该场景的官方建议?

更新:我向 Clemens Vasters(他在拥有 Remoting 和 WCF 的团队中)发送了这个问题:

Clemens,我知道您在同时拥有远程处理和 wcf 的团队中,我有几个问题,我认为我需要找到源头。

首先,我有一个关于远程处理是否会消失的问题。具体来说,我们有一个相当大的应用程序,它广泛使用远程处理进行进程内跨应用程序域通信,我想知道这种远程处理的使用是否被认为是“遗留”。如果是这样,AppDomain.CreateInstance 和朋友会被其他东西替换吗?

这是他的回复:

Remoting 是 .Net 框架的一部分,因此它不会消失。 COM 从 Windows NT 3.5/Windows 95 开始就在 Windows 中,并且没有消失,我也认为它不会很快消失。

也就是说,Remoting 的开发投资非常少。 WCF 是 Remoting 的继承者,并取代了 COM/DCOM 用于托管代码。

对于进程内、跨应用程序域通信 Remoting 是 CLR 的本机通信方式。如果您发现在短时间内抽取大量数据或大量消息时出现性能问题,您应该认真研究 WCF 和 NetNamedPipeBinding。

【问题讨论】:

  • 请参阅stackoverflow.com/questions/1295353/…,了解为什么在我的特定情况下 WCF 比远程处理慢得多。
  • Remoting 是 .NET 所固有的,它所扮演的角色及其工作方式的详细信息可以在 Don Box 和 Chris Sells 的 Essential .NET 中找到。但是,当组件间通信不可靠或速度慢时,它就会崩溃,并且与进程内消息传递相比,几乎所有传输(甚至是千兆位 LAN)都不可靠且速度慢。当人们谈论 WCF 慢时,他们通常会想到 Web 服务。如果您尝试将 Web 服务用于进程内通信,则 Web 服务会太慢。但是,它们旨在容忍缓慢和不可靠的连接,并在这些条件下运行良好。
  • @Peter:感谢您提供的信息,但您的一些假设是完全错误的。一,远程处理缓慢或不可靠。它不是。它非常快,非常可靠(当然是通过可靠的渠道)。另一个是“网络服务”(不管那是什么意思)很慢。他们不是。当然,任何进程中的任何东西都会比网络上的任何东西快得多,但这根本不是这个问题的意义所在......
  • 现在 wcf 快死了,微软推荐 grpc...

标签: .net wcf remoting


【解决方案1】:

称其为遗留技术更为准确。

http://msdn.microsoft.com/en-us/library/72x4h507%28VS.85%29.aspx

此主题特定于旧版 保留的技术 向后兼容现有的 应用程序,不推荐 为新的发展。分散式 现在应该开发应用程序 使用 Windows 通讯 基金会 (WCF)。

更新:WCF 不区分 inter/intra/process/inter/intra-appdomain。如果您在 WCF 中使用单机通信,则使用命名管道 - 使用它应该在几乎所有实际场景中提供良好的性能。

各种分布式通信技术的性能比较see here

【讨论】:

  • 那篇文章不是专门指在进程间通信中使用远程处理吗?在我看来,远程处理在跨应用程序域通信中仍然占有一席之地(AppDomain.CreateInstanceFromAndUnwrap 和朋友)。
  • 是的。如果这些类已被“弃用”,它们将应用 ObsoleteAttribute-msdn.microsoft.com/en-us/library/system.obsoleteattribute.aspx
  • @Mark, @RichardOD:这篇文章是关于 .NET Remoting 的头条文章。它不仅仅指进程间通信。此外,在 .NET 3.5 中没有 ObsoleteAttribute 的事实没有任何意义,因为宣布 Remoting(和 ASMX Web 服务)为“遗留”的决定是在 .NET 3.5 RTM 之后做出的。
  • @John:它们在 4.0 中也没有被标记为 [过时](至少现在还没有)。
  • @Mark:你的意思是 4.0 beta 1.
【解决方案2】:

是的。远程处理已被弃用......它是微软的官方。这是链接:

.NET Remoting

文章第一行用粗体表示:

本主题专门针对一种遗留技术,保留该技术是为了与现有应用程序向后兼容,而不是 推荐用于新开发。分布式应用程序现在应该 使用 Windows Communication Foundation (WCF) 开发。

我认为该措辞已被“弃用”,但显然他们将其称为“遗留”

【讨论】:

  • IMO 'deprecated' 比 'legacy' 强:'legacy' 意味着“不要开始”,而 deprecated 意味着“如果你已经开始,现在停止,因为它可能会被完全删除在未来的版本中”。
  • @Mark:我不这么看。 WCF 似乎与 Remoting 一样适用于进程内通信(请参阅 WCF 中的 NetNamedPipeBinding)。
  • @Mark:无论如何,Remoting 已被弃用。 @ChrisW:我怀疑 Remoting 是否会在短期内被移除,但你可以期待更少的错误修复(如果有的话)和更少的支持(如果有的话)。
  • @Mark - 你真正的问题是什么?远程处理被认为是遗留技术。听起来你不希望这是真的。您可能有充分的理由,但这并不真正符合 Microsoft 当前的建议。
  • @John:我想我是。我专门进行进程内跨应用程序域通信(使用 AppDomain.CreateInstanceFromAndUnwrap 和朋友),但我看不到使用 WCF 干净(或高性能)地做到这一点的方法。我很高兴改用 WCF(我在其他情况下经常使用它),但为此我很难让它按我想要的方式工作。我将发布关于该特定场景的另一个问题。
【解决方案3】:

如果您想迁移到 .NET Core,您必须为 无论如何远程:

.NET Remoting 被确定为有问题的架构。它用于跨 AppDomain 通信,不再支持。此外,Remoting 需要运行时支持,维护成本很高。由于这些原因,.NET Core 不支持 .NET Remoting,我们不打算在未来增加对它的支持。

来源:https://docs.microsoft.com/en-us/dotnet/core/porting/libraries#remoting

【讨论】:

【解决方案4】:

Clemens Vasters,Microsoft .NET 服务总线(即 Remoting 和 WCF)的技术主管,在 this forum post 中谈到了 WCF 与 Remoting。总结这篇文章,他最终推荐 WCF 而不是 Remoting。

我不确定 .NET 4.0 是否在内部使用远程处理,但您可以尝试向 Clemens 发送问题...我相信他知道答案。

【讨论】:

  • 一位微软员工推荐使用新的 shiny-new-incompatible-with-everything-else 方法而不是任何形式的标准?令人震惊。
  • WCF 与其他一切不兼容的原因是什么? Remoting 与什么兼容?
  • 如果您正在寻找兼容性,WCF 是唯一的选择(当然 asmx 除外,但这也是“遗留”)。远程处理从不适合需要兼容性的场景。
  • 我接受了您的建议并询问了 Clemens。他的回答是:“Remoting 是 .Net Framework 的一部分,因此它不会消失……对于进程内、跨应用程序域通信 Remoting 是 CLR 的原生通信方式。”
  • 他接着说你应该“认真看看 WCF 和 NetNamedPipeBinding。”
【解决方案5】:

我认为现在(2015 年)即使是跨应用程序也很清楚 域: https://msdn.microsoft.com/en-us/library/vstudio/ms180984(v=vs.100).aspx

跨应用程序域远程处理 此主题特定于旧版 为向后兼容现有技术而保留的技术 应用程序,不建议用于新的开发。分散式 现在应使用 Windows Communication 开发应用程序 基金会 (WCF)。

那么 WCF 也应该用于跨应用程序域。

【讨论】:

  • 七年过去了,WCF 又被放弃了,因为 netcore 是跨平台的。显然 WCF 是 Windows 的东西,尽管据我所知,他们可以通过重命名 MCF 来解决这个问题。
猜你喜欢
  • 2012-04-21
  • 1970-01-01
  • 2019-08-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多