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

时间:2011-05-06 17:35:48

标签: c# asp.net android wcf 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套接字的完全自定义服务,并从头开始编写所有内容(身份验证,会话管理,序列化等)。这就是我最了解的 about ,但我的假设是有更好的东西。
  • 使用WCF服务进行传输,自己负责身份验证和/或会话管理,或使用类似持久服务的会话管理

我的基本问题是:

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

2 个答案:

答案 0 :(得分:2)

(我正在假设“有状态”是指基于会话的)。

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

您可能不愿意,因为在移动平台上通常没有对SOAP的开箱即用支持(请参阅:How to call a web service with Android)。毫无疑问它与iOS同样痛苦。从浏览器(“ASP.NET”)调用SOAP并不好玩。我甚至不确定它是否可能!

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

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

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

答案 1 :(得分:0)

1)考虑使用单例的有状态实用程序服务,但保持外观级别的请求/响应模式无状态。 2)考虑分布式缓存,也许是Windows Server AppFabric Cache。