3

我正在寻求有关我的系统架构的帮助。让我概述一下:

我有一个通过一组 wcf 服务访问的 sql server 和 oracle 数据库。

这些 wcf 服务端点被许多 Web 应用程序使用。

所有应用程序都是用 .net c# 4.0 编写的。

现在需要移动应用程序(iphone 应用程序、android 应用程序)访问数据库提供的数据。

我的第一个问题是,向移动应用程序提供数据的最佳媒介是什么?我相信的选项包括通过我现有的 wcf 服务或一个包装器项目(调用现有的 wcf 服务)公开移动应用程序可以访问的 WebApi 或 MVC 控制器。针对移动应用程序消费的最佳方法的建议。考虑到移动应用程序需要小负载,并且还需要采取安全措施来防止未经授权的移动应用程序访问服务/包装器项目。

我的下一个问题是关于 WCF 服务的版本控制。我希望能够在不影响潜在包装器项目的情况下无缝更新 wcf 服务,反之亦然。由于第三方移动应用程序将处于不同的发布周期,因此需要支持多个版本。我预计这可能涉及部署应用程序的多个版本,但想知道通常如何处理这种做法?

所有应用程序都部署在 IIS 7.0 中的 Windows 服务器上。

4

4 回答 4

2

嗯......我很想听听其他答案,但这是我对你的问题的看法。

首先,我认为您应该将业务逻辑与 WCF 服务分离,如果您还没有这样做的话。这使您能够将 ASP.NET Web Api 服务与 WCF 服务并排设置。与其让一些 MVC 或 Web Api 调用您的 WCF,不如将其作为替代方案并排放置。

你也可以在你的 WCF 服务中创建 Json 端点,尽管我更喜欢同时拥有 WCF 和 Web Api 的想法,因为最新版本更具互操作性。如果您将所有逻辑与服务分离,它们应该变得相当简单,共享所有业务逻辑。

对于您的手机 iphone 和 android 应用程序,使用 Web Api 服务可能更容易。我在维护多个版本的服务 Api 方面经验不足,但如果您将移动应用程序连接到 Web Api 服务,则可以通过为每个 api 版本创建多个文件夹来进行版本控制。这将导致业务逻辑的重复......

正如我所说,我对其他意见很感兴趣。

于 2012-05-10T22:06:11.933 回答
1

如有疑问,请插入抽象。我会想象您已经构建的服务作为域服务。这些服务通过模型 (DTO) 和更新 (API) 为具有不同需求的多个客户提供服务。为了实现您可以轻松版本化并能够灵活地减少网络上的内容,请为您想要支持的屏幕引入一个层。

我建议构建一个“移动服务”,它只能依赖于域服务,并且有办法将 DTO 转换为移动消耗块。该层可以在 ASP.NET WebAPI 中,也可以在 vert.x 或 node.js 之外,以便您可以根据需要启动功能。最后,你想要的是域和消费者之间的服务契约,并在它们之间引入一个层,从长远来看,你可以利用它来替换任何一端,而不会产生巨大的成本。它允许您根据任一需要对 API 进行版本控制,而无需重新修改整个堆栈。

当然,您需要考虑一种方法,让客户端设备提前告诉您,它们需要您的服务提供哪些功能,以便您可以确定要达到的逻辑端点。这将允许您为客户端和域之间的版本协商开辟道路。

我建议查看 LinkedIn 基础架构,了解他们如何构建他们的移动应用程序(是的,他们不使用 ASP.NET,但架构模式仍然是合理的)。

我的2c。

于 2012-05-11T12:50:05.503 回答
1

如果您想要移动支持,最好避免使用 WCF 并使用 Web API。原因是,虽然所有本机移动平台都可以使用 XML,并且在 WCF 中,您可以使用基本 HTTP 绑定来模拟旧式 Web 服务,但 Web API 提供了通过 HTTP 进行的精简和平均通信,这些平台的浏览器也可以使用,并且不仅仅是本机代码。

如果是移动性和互操作性,我会毫不犹豫地使用 Web API。

我只会在某些条件下使用 WCF 。

于 2012-05-10T22:40:05.567 回答
1

正如 Dante 所说,我肯定会将 JSON 视为我的数据格式。也按照建议分成 n 层。

在授权方面...

你有多少第三方应用程序?听起来您拥有的资源并不多,但如果您拥有(并且它们是真正的第三方,即不受您控制),那么您可能需要为此查看 OAUTH 解决方案。

如果您只有少数并且您可以控制,那么 IMO 就太过分了,相反,我只需要一个每个应用程序都知道的简单密钥。每个调用都会传递密钥,服务会对此进行检查。显然,所有传输都应该通过 SSL 进行,因此没有人可以窃听密钥或数据是什么。

在检查密钥方面,您需要使用方面或自定义属性来避免在每个函数上编写样板文件。

于 2012-05-10T22:36:10.533 回答