从MVC控制器调用WEBAPI服务是一种反模式吗?

11
如果决定使用WebAPI创建服务层用于各种客户端,请问构建Web客户端的最佳方式是什么?
由于WebAPI很友好,因此可以直接使用JavaScript从客户端进行调用。但是我担心这会很快变得混乱,并且JavaScript并不是最容易进行单元测试的技术。
另一种选择是使用HttpClient类从MVC控制器调用REST服务。这是一个有效的方法吗?
我想这两种方法可以结合起来,但我担心这可能会变得混乱。您是否同意选择一种方法或另一种方法更好?
抱歉,我看到了许多关于使用WebAPI或MVC的帖子,但没有关于将两者结合使用的帖子。
你有什么想法?

你的应用程序中已经有一个MVC项目,现在你想从中提取出服务层吗? - VJAI
不,这是一个全新的项目。 - Dan Ryan
2个回答

17
另一种方法是使用HttpClient类从MVC控制器调用REST服务。这种方法可行吗?是的,完全没问题。只是代码不应该放在控制器中,而应该放在数据访问层(DAL)中,因为控制器不应该知道数据来自哪里(平面文件、数据库、Web API等)。 因此有两种方法: 1.您决定使用HTTP协议从MVC客户端应用程序消耗您的Web API。在这种情况下,您创建一个实现存储库(DAL层),它将使用HTTP客户端并直接返回域模型。 2.您决定直接使用此Web API中包含的服务而不发送HTTP请求。在这种情况下,您在MVC客户端应用程序中引用包含Web API的服务层的程序集,直接将此程序集成为MVC应用程序的服务层。在这种情况下,Web API通过HTTP为其他客户端提供服务:JavaScript、移动设备等。 您选择哪种方法取决于您的具体场景和要求。您是否需要支持除MVC客户端应用程序之外的互操作客户端?在任何情况下,首先定义一个包含您的领域模型和其他内容的单独程序集中的服务层。然后,您始终可以通过Web API(或WCF服务或其他服务)公开此服务层或直接从.NET客户端引用它。

关于第二种方法,如何实现?不清楚如何创建WebAPI的实例来调用实例方法,因为这似乎是在直接调用控制器操作方法时遇到的类似问题(而不是使用RenderAction),因为控制器期望它从MVC框架中实例化(以获取各种上下文信息,例如HttpRequest.Current、Principle等)。因此,从MVC控制器实例化WebAPI类并直接调用方法,请求不会通过WebAPI管道,所以我认为这还需要更多的工作? - AaronLS
不是在挑战你,只是试图想象这种方法会是什么样子。我记得在使用WCF时,如果你从同一台机器上的另一个进程调用WCF服务,你可以使用命名管道+二进制序列化来获得更好的性能。你知道WebAPI有类似的东西吗? - AaronLS
@AaronLS,ASP.NET Web API旨在创建RESTful Web服务。在REST世界中,没有命名管道和二进制序列化的概念。 - Darin Dimitrov

1

我认为您有一个MVC项目,并且正在尝试将api操作从MVC项目中分离出来,创建一个单独的Web API项目?如果是这样,您必须在跳跃并创建单独的服务项目之前权衡利弊。

一旦您创建了一个单独的Web API项目,那么由于跨域障碍(当然有JSONP和CORS,但它们不会让事情变得容易),您就不能轻松地直接从JavaScript中使用服务方法在MVC项目中消耗,因此您必须依赖于HttpClient类,在控制器中创建不必要的包装器方法与服务通信。

当您拥有需要由API方法提供数据的视图时,值得考虑将API内容放在同一个MVC项目中,但唯一的问题是您必须使用ApiController而不是Controller


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