2012-07-16 56 views
11

如果决定使用WebAPI创建要用于各种客户端的服务层。构建Web客户端的最佳方式是什么?这是从MVC控制器调用WEBAPI服务的反模式吗?

由于WebAPI是Web友好的,所以可以直接从客户端使用JavaScript来使用它。不过,我担心这可能会很快得到混乱,JavaScript并不是最容易进行单元测试的技术。

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

我想,这两个技术途径上述可以合并,但我会担心,这将导致混乱。你是否同意使用一种方法或另一种方法会更好?

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

想法?

+0

你的应用程序中是否已经有了一个MVC项目,并且正试图从中提取出服务层? – VJAI 2012-07-16 12:44:32

+0

不,这是一个绿地项目。 – 2012-07-16 13:37:46

回答

16

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

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

所以有2种方法:

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

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

+0

关于第二种方法,这将如何实施?不清楚创建webapi的实例来调用实例方法,因为它看起来像直接调用控制器操作方法(而不是使用RenderAction)时的类似问题,因为控制器希望它从MVC框架实例化(for各种上下文信息,如HttpRequest.Current,Principle等)。因此,从MVC控制器实例化webapi类并直接调用方法,请求不会通过webapi管道,所以我期望会有更多这样的事情? – AaronLS 2014-01-24 22:55:43

+0

不要挑战你,只是试图想象这种方法会是什么样子。我记得WCF,如果你从同一台机器上的另一个进程调用WCF服务,你可以使用命名管道+二进制序列化来获得更好的性能。你知道WebAPI这样的事吗? – AaronLS 2014-01-24 22:59:40

+0

@AaronLS,ASP.NET Web API专为创建REST风格的Web服务而设计。在REST世界中,没有像命名管道和二进制序列化这样的概念。 – 2014-01-25 07:12:23

1

我认为你有一个MVC项目,您试图从MVC项目的API操作分离出来,成为一个独立的网络API项目?如果是这种情况,您必须在跳跃和创建单独的服务项目之前权衡好处。

一旦你创建了一个单独的web api项目,那么你不能轻易地从你的MVC项目中的JavaScript直接使用服务方法,因为跨域的障碍(当然有JSONP和CORS,但它们不会让事情所以你必须依靠HttpClient类在控制器中创建不必要的包装器方法来与服务进行通信。

当你的视图需要你的api方法提供的数据时,在同一个MVC项目中使用api的东西是值得的,但唯一的是你必须使用ApiController而不是Controller

相关问题