[英]Creating a stateful client-server architecture in WCF
我目前正处于计划阶段,对我们的一个核心(商业)软件产品进行了相当全面的重写,我正在寻找一些建议。
我们当前的软件是一个用Winforms编写的业务管理包(最初在.NET 2.0中,但到目前为止已转换为4.0),它直接与SQL Server后端通信。 还有一个非常简单的ASP.NET Webforms网站,为旅途中的用户提供一些基本功能。 我们的每个客户都必须向全世界公开这个网站(以及一些现有的ASMX网络服务)才能使用它,我们开始不再适应这种设置。
当我们重写这个软件包时,我们已经决定最好是从外部更容易访问软件包,并为我们的客户提供允许我们托管数据的选项(我们还没有决定提供商)而不是要求它们在本地托管SQL Server,SQL Server Reporting Services和IIS。
目前,我们的计划是使用WPF重写现有的Winforms应用程序,并通过Web提供更丰富的客户端体验。 然而,展望未来,我们的客户表示有兴趣使用平板电脑,因此我们还需要支持iOS和Android原生应用程序作为客户端。
我们希望提供非现场托管(无需使用VPN架构)以及支持.NET生态系统之外的平台上的客户端,这使我们得出结论:我们所有的客户端 - 服务器通信都应该发生通过我们自己的服务,而不是使用SQL Server客户端(因为我们不希望将它暴露给世界,并且据我所知,SQL Server驱动程序不存在,对于某些平台而言)。
现在,我看到他们的选择是:
我的基本问题是:
(我正在假设“有状态”是指基于会话的)。
我想一个很大的问题是:你想在你的消息堆栈中使用SOAP吗?
您可能不喜欢,因为在移动平台上通常没有对SOAP的开箱即用支持(请参阅: 如何使用Android调用Web服务 )。 毫无疑问它与iOS同样痛苦。 从浏览器(“ASP.NET”)调用SOAP并不好玩。 我甚至不确定它是否可能!
不幸的是,如果您不使用SOAP,那么很快就会排除大多数WCF标准绑定。 剩下的那个,“ Web HTTP ”,不支持会话,因为很明显HTTP是无状态协议。 您实际上可以使用基于Cookie的解决方案手动添加会话支持。
您可以使用TCP传输(它支持会话),并构建您自己的通道堆栈以支持非SOAP编码(例如协议缓冲区 ),但即使这样您也需要小心,因为TCP传输会放置特殊的“框架”在其中的字节,这将使互操作非平凡。
您需要在会话中存储哪种状态? 也许有其他方法?
1)考虑使用单例的有状态效用服务,但保持门面级别的请求/响应模式无状态。 2)考虑分布式缓存,也许是Windows Server AppFabric Cache。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.