在WCF中创建有状态客户端 - 服务器体系结构

Ada*_*son 5 c# asp.net wcf android ios

我目前正处于规划阶段,对我们的一个核心(商业)软件产品进行了相当全面的重写,我正在寻找一些建议.

我们当前的软件是一个用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驱动程序不存在,对于某些平台而言).

现在,我看到他们的选择是:

  • 编写一个完全自定义的服务,使用TCP套接字并从头开始编写所有内容(身份验证,会话管理,序列化等).这是我最了解的,但我的假设是有更好的东西.
  • 使用WCF服务进行传输,自己负责身份验证和/或会话管理,或使用类似持久服务的会话管理

我的基本问题是:

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

Jac*_*eja 2

(我正在假设“有状态”意味着基于会话)。

我想一个大问题是:您想在消息传递堆栈中使用 SOAP 吗?

您可能不喜欢这样做,因为移动平台上的 SOAP 通常没有开箱即用的支持(请参阅:如何使用 Android 调用 Web 服务)。毫无疑问,iOS 也同样令人痛苦。从浏览器(“ASP.NET”)调用 SOAP 并不有趣。我什至不确定这是否可能!

不幸的是,如果您不使用 SOAP,那么很快就会排除大多数 WCF 标准绑定。剩下的“ Web HTTP ”不支持会话,因为显然 HTTP 是一种无状态协议。实际上,您可以使用基于 Cookie 的解决方案手动添加会话支持。

您可以使用 TCP 传输(它支持会话),并构建自己的通道堆栈来支持非 SOAP 编码(例如protocol-buffers),但即便如此,您也需要小心,因为 TCP 传输放置了特殊的“框架”字节,因此这将使互操作变得不平凡。

您需要在会话中存储哪种状态?也许还有其他方法?