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

时间:2012-07-16 10:59:14

标签: .net asp.net-mvc asp.net-web-api

如果决定使用WebAPI创建用于各种客户端的服务层。构建Web客户端的最佳方法是什么?

由于WebAPI对Web友好,因此可以使用javascript直接从客户端使用它。但是我担心这会很快变得混乱,并且javascript不是最简单的单元测试技术。

另一种方法是使用HttpClient类从MVC控制器调用REST服务。这是一种有效的方法吗?

我认为上述两种方法可以合并,但我担心这会变得混乱。你是否同意采用一种方法或另一种方法更好?

对不起,我看过很多关于是否使用WebAPI或MVC的帖子,但没有关于两者合并的帖子。

思想?

2 个答案:

答案 0 :(得分:17)

  

另一种方法是使用HttpClient类来调用REST   来自MVC控制器的服务。这是一种有效的方法吗?

是的,绝对的。只是这个代码不应放在您的控制器中,而应放在DAL层中,因为控制器不应该知道数据来自何处(平面文件,数据库,Web API等)。

所以有两种方法:

  • 您决定使用HTTP协议从MVC客户端应用程序中使用Web API。在这种情况下,您将为您的存储库(DAL层)创建一个实现,该实现将使用HTTP客户端并直接返回域模型
  • 您决定直接使用此Web API中包含的服务而不发送HTTP请求。在这种情况下,您将在MVC客户端应用程序中引用包含Web API服务层的程序集,并直接将此程序集成为MVC应用程序的服务层。在这种情况下,Web API通过HTTP服务于其他客户端:javascript,mobile,...

您选择哪种方法实际上取决于您的具体方案和要求。您是否需要支持除MVC客户端应用程序之外的可互操作客户端?无论如何,首先要在包含域模型和内容的单独程序集中定义服务层。然后,您可以始终通过Web API(或WCF服务或其他)公开此服务层,或直接从.NET客户端引用它。

答案 1 :(得分:1)

我认为你有一个MVC项目,并且你试图将api操作从MVC项目分离到一个单独的web api项目中?如果是这种情况,您必须在跳跃和创建单独的服务项目之前权衡利益。

一旦你创建了一个单独的web api项目,你就不能轻易地从你的MVC项目中的javascript中直接使用服务方法,因为跨域屏障(当然有JSONP和CORS但是他们没有这么做简单),所以你必须依赖HttpClient类在控制器中创建不必要的包装器方法来与服务进行通信。

当您拥有需要api方法提供的数据的视图时,有必要考虑在同一MVC项目中使用api内容,但唯一的事情是您必须使用ApiController而不是Controller