.NET 1.1和.NET 3.5之间沟通的“最佳”方式

6

我的最佳选择是:

  • 开发成本最便宜(1.1 项目不太可能存活> 6 个月)
  • 最容易迁移到 WCF 或类似技术

通过“相互通信”,我指的是:

  • 计算机之间的远程通信
  • 很可能没有防火墙限制

使用 .Net 1.1 的选项似乎有:套接字、远程处理和各种类型的 Web 服务。

提出了使用二进制序列化 DataTables 通过套接字的解决方案,但我对此持谨慎态度。

更新:在这种情况下,“服务器”是带有 .Net 1.1 的 Windows 嵌入式标准版。在此阶段,我们无法向镜像中添加任何新组件,例如 IIS、ASP 或 MSMQ 等。请考虑到这一点。


远程调用在1.1版本中已经存在...如果WCF基于类似的概念,那么这不会提供一个平滑的升级路径吗? - Jack Ukleja
1
我会谨慎地认为1.1项目很快就会消失。有时候人们认为某些东西会在6个月内消失,但8年后却发现,“哇,我们仍然在使用它?”就像我在2010年工作的地方仍然使用Windows 2000服务器一样。 - JB King
JB,我跟着你。在这种情况下,发布周期非常稳定...我们只支持同时存在2个版本(旧版+当前版),1.1版本已经在使用一段时间了,所以下一个主要版本将强制进入弃用队列! - Jack Ukleja
7个回答

8

由于最终您将迁移到WCF,因此您可能希望立即构建一个WCF服务,使用支持旧ASMX风格Web服务的BasicHttpBinding,即WS-BasicProfile 1.1。您可以轻松地从.NET 1.1应用程序中使用此服务。

您还可以考虑在WCF中使用MsmqIntegrationBinding,在其中,您的.NET 1.1应用程序将从MSMQ发布/接收消息。

您可能需要查看以下相关文章:


在这种情况下,“服务器”是1.1应用程序。这是否可以反过来使用?从WCF消耗1.1 Web服务? - Jack Ukleja
是的,使用BasicHttpBinding的WCF客户端可以消费ASMX web服务。即使使用MsmqIntegrationBinding的客户端的MSMQ方法仍然是一种选择。 - Daniel Vassallo
我希望人们能停止投票支持这个;) 据我所知,由于IIS依赖关系,在此阶段我们无法使用Web服务。 - Jack Ukleja
我认为远程调用是一种 .NET 特有的技术,限制了它与其他客户端的灵活性。只要您在客户端和服务器上都使用 .NET,那么就不会有问题。WCF 应该能够处理对使用 .NET 远程调用的服务器的连接,但我不确定它有多容易。 - ajawad987
我们最终使用了 BasicHttpBinding。 - Jack Ukleja

3

能否在常规进程(非ASP.NET)中托管ASMX? - Jack Ukleja
1
不,那不切实际。你为什么需要这样做呢? - John Saunders
因为服务器实际上是运行在嵌入式设备上的服务,而不是ASP.NET。 - Jack Ukleja
嵌入式设备是否可以调用web服务?这样它可以定期调用web服务来启动通信,而不是被连接到它? - Mark Redman
可能吧,但我们试图远程编辑的数据是嵌入式设备所持有的。我不确定服务器发起的通信是否可行。 - Jack Ukleja

1
套接字应该相当简单。你需要发送什么样的数据?如果只是简单的字符串/其他原始类型,你可以构造一个基本的xml布局,然后发送它。

该应用程序本质上是一个远程数据编辑器,因此可以考虑关系型数据或业务对象(待定)。 - Jack Ukleja
嗯,如果数据足够简单,它应该仍然可以工作。不过我可能会先调查一下马克的选项,假设你能让 ASMX 连接并发送实际对象,生活可能会更美好。 - Noon Silk

1

我们在代码中使用远程调用和Web服务进行1.1 <--> 3.5之间的通信。我们发现Web服务最容易从1.1移植到3.5。


1.1能够生成的WS接口与WCF提供的接口有多相似?(我的1.1有点生疏!)即,如果最终用3.5替换1.1应用程序,客户端过渡相对无缝会很好。例如,1.1不支持泛型。 - Jack Ukleja
看起来你可以使用WCF创建一个1.1兼容的WS,这可能是一种解决方法,直到你能让所有客户端升级。 - Andrew Cox
它们中的任何一个移植成本是否显著? - Jack Ukleja
其实没有什么特别的费用,只是将1.1升级到3.5所需的正常成本。 - Andrew Cox

1
在.NET 1.1中,您实际上无法拥有二进制序列化的数据表。在1.1中,并且默认情况下在2.0中,当您使用BinaryFormatter序列化DataSet或DataTable时,您得到的是存储在字节数组中的XML序列化,其中包含您可能期望的所有重复标记的膨胀。
在.NET 2.0及更高版本中,您可以在DataSet或DataTable上设置RemotingFormat = SerializationFormat.Binary以获得真正的紧凑二进制序列化,但我不认为这是.NET 1.1中的选项。

非常有趣。这给了我一些武器来打击套接字和二进制数据集。谢谢。 - Jack Ukleja

1
信不信由你,在一些调查之后,Remoting 看起来实际上是一个非常好的候选者:
  • 它提供了类似于 WCF 的 API
  • 它比 sockets 更高级
  • 支持多个“通道”(HTTP 或 TCP)
  • 相当容易迁移到 WCF(需要进行代码更改)。
就我所知,由于它需要 ASP.NET,而我们没有 + 通常需要太多设置,因此Web Services 对于 1.1 来说“太难了”。 Sockets 太低级了。
由于入门门槛较高(类似于 Web Services),MSMQ 被排除在外...我们无法向我们的 Windows 嵌入式构建(1.1 机器)添加任何新组件,我怀疑 MSMQ 不是“标准配置”。

你考虑过编写REST风格的WCF服务吗?在.NET3.5中编写它非常容易,而使用此服务也同样容易。这是一个构建和使用REST服务的绝佳教程:http://www.robbagby.com/rest/rest-in-wcf-blog-series-index/通过这种方式,无需在IIS上设置ASP.NET来托管你的.NET 3.5应用程序。WCF可以轻松地托管在任何类型的应用程序中,例如Windows服务或控制台应用程序或WinForms应用程序。 - ajawad987
问题是服务器是 .net 1.1 ... 没有可用的 IIS。我们需要自托管(像3.5一样),不确定它是否可以在1.1上运行。此外,1.1没有 WCF,需要使用第三方或自己编写 REST... 然后开始听起来太麻烦了。 - Jack Ukleja

1

你不需要使用内置序列化来序列化DataTable对象。DataTable只是一组列和行。您应该简单地循环遍历表的行,并对每行进行序列化。

根据您的权衡,您可能希望将DataTable复制到等效的数据传输对象中,然后对该对象进行二进制序列化。这样的对象将由一个对象数组组成,这些对象镜像了DataTable的结构。该对象将具有与DataTable的每个列对应的一个属性。

这样,您就可以避免序列化表元数据,同时获得轻松快速的二进制序列化。

鉴于此,我会避免Remoting。虽然其结构与WCF相似,但几乎没有支持。你已经被困在了几乎过时的.NET版本上,你真的不想依赖于一个技术,它本身就已经过时了。

套接字并不美观,但它们是被充分理解的。如果你小心谨慎,你将创建相对容易维护的套接字代码,至少在你必须坚持使用.NET 1.1的这段时间内。

你可能想要查看.NET 2.0中新增的类(例如TcpClient),并创建类似的API。这样,如果你能够将图像更新到.NET 2.0,那么你会发现更容易利用微软将必须维护的代码。


一些有趣的想法。但是远程调用的支持状态目前并不关心我... 是的,它是遗留技术,但它仍然得到.NET本身广泛的支持和使用。与其信任自己编写的套接字代码,我宁愿选择使用它。 - Jack Ukleja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接