【问题标题】:how should I architect my applications to support mobile app's我应该如何构建我的应用程序以支持移动应用程序的
【发布时间】:2012-05-10 21:32:37
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

  • @Aliostad 提出了一个很好的观点,我建议您阅读他的博客文章。如果您只关心 RPC,那么 WCF WebHTTP 对您来说应该没问题...否则请查看 Web API
  • 对于 WCF 版本控制,可能最简单的方法是基于路径的(https://host/service/1.0http://host/service/2012-05-11)。另外 - 可能你不应该将 Web api 包裹在 WCF 周围,两者都应该是包裹业务逻辑的“服务层”。

标签: c# wcf mobile architecture asp.net-web-api


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    在身份验证方面...

    您有多少第三方应用程序?听起来你有很多东西,但如果你有(而且它们是真正的第三方,即不受你控制),那么你可能想看看一个 OAUTH 解决方案。

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

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

    【讨论】:

      【解决方案3】:

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

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

      我只会在certain conditions 中使用 WCF。

      【讨论】:

        【解决方案4】:

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

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

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

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

        我的 2c。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多