在WCF中创建一个有状态的客户端-服务器架构

5

我目前正在计划对我们其中一个核心商业软件进行全面重写,需要一些建议。

我们目前的软件是一个Winforms编写的业务管理软件(最初是在.NET 2.0上编写的,但已经过渡到4.0),直接与SQL Server后端通信。还有一个非常简单的ASP.NET Webforms网站,为用户提供基本功能。每个客户都必须将此站点(以及几个现有的ASMX web服务)暴露给外界才能使用它,而我们开始超越了这种设置。

随着我们重写这个软件包,我们已经决定最好使软件包更容易从外部访问,并为我们的客户提供让我们托管他们的数据(我们尚未确定提供程序)的选项,而不是要求他们在场地上托管SQL Server、SQL Server Reporting Services和IIS。

现在,我们的计划是使用WPF重写现有的Winforms应用程序,并在Web上提供更丰富的客户端体验。然而,未来,我们的客户表示有兴趣使用平板电脑,因此我们需要支持iOS和Android本机应用程序作为客户端。

我们希望提供远程托管(而不必使用VPN架构)并支持.NET生态系统之外的平台上的客户端,这导致我们得出结论:所有客户端-服务器通信都应通过我们自己的服务进行,而不是使用SQL Server客户端(因为我们不想将其暴露给外界,而且据我所知,某些平台没有SQL Server驱动程序)。

现在,我认为我们的选择有:

  • 编写完全定制的服务,使用TCP套接字并从头编写所有内容(身份验证、会话管理、序列化等)。这是我最了解的,但我的假设是有更好的选择。
  • 使用WCF服务进行传输,并自己处理身份验证和/或会话管理,或者使用像持久服务这样的东西来进行会话管理

我的基本问题是:

什么是提供面向WPF、ASP.NET、iOS和Android客户端的有状态、持久化服务的最适当的整体架构选择以及特定功能,例如ASP.NET身份验证或持久化服务?


1
我很惊讶你从问题中移除了WCF标签。你能解释一下你所说的有状态是什么意思吗?我必须说,为移动设备开发的可互操作服务通常使用REST方法。持久化服务是在工作流服务中引入的,用于将运行中的工作流持久化到数据库中。 - Ladislav Mrnka
就WPF而言,使用什么基础服务架构并不重要。它已经足够独立,以至于您很可能希望在其之间有某种模型(也可能是ViewModel)层。 - Matt West
@Ladislav:手指打错了;我想标记的是WCF,而不是WPF。至于有状态,我认为不需要太多。基本上只需要能够验证发送者并可能能够在调用之间维护一些会话信息。我认为这不会很多,但客户端当前的一些内容将在服务器上(为了跨平台的一致性),我希望确保我们不会束缚自己。 - Adam Robinson
@Matt:我现在并不是特别关心WPF的细节,而是想要明确我们将为桌面、Web和移动设备提供服务。 - Adam Robinson
2个回答

2
(我假设“有状态”指基于会话。)
我想一个很重要的问题是:你是否想在消息堆栈中使用 SOAP?
你可能不太愿意这样做,因为移动平台上通常没有 SOAP 的开箱即用支持(参见:如何在 Android 上调用 Web 服务)。毫无疑问,在 iOS 上也同样麻烦。从浏览器(“ASP.NET”)调用 SOAP 肯定不好玩。我甚至不确定是否可能!
不幸的是,如果你不使用 SOAP,那么这很快排除了大多数 WCF 标准绑定。在剩下的那个中,"Web HTTP",由于 HTTP 显然是一个无状态协议,所以不支持会话。你实际上可以使用一个基于 Cookie 的解决方案手动添加会话支持。(点击此处查看) 你可以使用 TCP 传输(它支持会话),并构建自己的信道堆栈以支持非 SOAP 编码(例如 protocol-buffers),但即使这样,你也需要小心,因为 TCP 传输在其中放置了特殊的“封装”字节,这将使得交互操作起来不太容易。
你需要在会话中存储什么状态?也许有替代方案?

我并不是真正的支持或反对SOAP,但(正如你所提到的)互操作性是我最关心的问题。冗长也是一个问题,但如果这是唯一的问题,我会忽略它。至于我计划在会话中存储什么,我不“预计”会很多。目前,我认为我只需要能够验证用户身份就可以了(也就是说,我真的需要会话),但是客户端上当前存在的一些内容以后将会在服务器上,所以我不完全确定我需要什么。我希望有一个代表会话的长期对象,它只需 - Adam Robinson
这些数据将在会话期间存在于内存中,但这只是我的实现偏好。显然,我可以通过持久化信息并在调用之间重新恢复它来模拟它,但我想如果已经有提供这个功能的东西,那就更好了。 - Adam Robinson
如果您选择了像HTTP这样的无状态协议,您将需要使用cookie来实现。持久化服务可能会通过其实例ID概念为您提供类似于会话的功能,因此可能适用。 - Jack Ukleja
我需要使用cookies来做这个吗?为什么?如果我们谈论的是一个URL不会被看到的Web服务,那么将会话标识符作为GET或POST参数传递是否同样有效呢? - Adam Robinson

0

1)考虑使用单例模式来实现有状态的工具服务,但在门面层保持请求/应答模式无状态。 2)考虑分布式缓存,例如Windows Server AppFabric Cache。


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