使用WebAPI或MVC在ASP.NET中返回JSON


138

我正在构建一个客户端脚本繁重的ASP.NET MVC应用程序,它将使用JSON和jQuery来操作DOM。

我的理解是Web API ControllerMVC Controller都可以返回JSON。

在我的情况下,应该使用Web API控制器还是MVC控制器



1
需要注意的重要一点是,这个问题特定于特定的上下文:作者想知道如果只返回json时要使用哪个控制器。REST API允许根据内容协商使用不同的媒体格式(例如:接受xml,接受json)。在这种情况下,WebAPI控制器是您的最佳选择
Sentinel

Answers:


156

可以在任何ASP.NET应用程序中创建并托管Web API控制器,而不仅仅是MVC应用程序。因此,创建Web API的明显原因是您没有MVC前端(例如,公司/组织托管的经典RESTful Web服务)。

MVC控制器通常依赖于MVC框架,如果您查看默认模板以及社区和对等方所做的大部分工作,您会注意到几乎所有MVC控制器都是在考虑视图的情况下实现的。

就个人而言,当我打算用View()进行响应时,我会使用MVC控制器,而对于不依赖于特定视图的任何事物,我都会使用Web API。

当然,有一些警告,但是通常来说,如果您不需要MVC的模型绑定行为,则您的服务是以数据为中心,而操作是以数据为中心(例如CRUD操作),那么您可能希望使用“ Web API控制器”而不是“模型视图控制器”。相反,如果您的操作是以视图为中心的(例如,向用户提供用户管理页面),或者您需要MVC的模型绑定来生成“ ajax局部”(非常不可能),那么您将需要MVC控制器。

我个人使用Web API控制器来驱动基于JSON的RESTful客户端,我使用MVC控制器来处理基本的浏览器路由和SPA的传递。


32

WebAPI用于制作API。如果您希望某人能够使用XML,JSON等格式的API,则可以制作一个Web api。

在您的情况下,您只需要使用JSON与客户端对话即可。

即使您的网站主要是由客户端脚本驱动的,您仍将使用ASP.NET MVC Controller对吗?并且由于您可能已经根据实体在逻辑上划分了控制器,因此有必要在其中添加这些json服务方法,而不是专门为Web API创建另一个类。

因此,对于您的特殊情况(如果我理解正确的话),我会坚持使用Controllers。


谢谢,我们在创建WebAPI和控制器方面有什么区别吗?
尼尔·潘

1
@flybyte是的,您需要从ApiController派生,请参见asp.net/web-api/overview/getting-started-with-aspnet-web-api/…–
Muhammad Hasan Khan

4
Web Api可以执行JSON以及您列出的其他方法。控制器不能(巧妙地)变成一个API,因此鉴于用户有远见,我建议使用更具可扩展性/灵活性的解决方案。Web api似乎不像以前的WCF服务那样,既强大又灵活。因此,尽管您只需要简单的方案,但它不会影响您的工作。但是如果您需要的话,您就拥有了强大的力量
Steve

8

答案归结为关注点的分离,加快了服务的创建以及依赖惯例而不是配置。

控制器的主要职责是充当视图与模型之间的协调者,而API的主要职责是处理数据。如果使用API​​的约定,则可以非常轻松地执行CRUD操作。以下是CRUD操作与HTTP操作之间的映射

  • GET:阅读
  • POST:创建
  • 放置:更新
  • 删除:删除

因此,使用API​​,您不必创建单独的动作并将其分配给HTTP动作。


0

我对ApiController唯一的担心是它基于站点而不是基于区域。一个站点只能有一个apicontroller子文件夹,以便您命名控制器方法。在某些情况下,您可能需要在不同区域中复制控制器名称:

domain.com/api/area1/controller1/

domain.com/api/area2/controller1/

我记得有一些自定义代码设置可以执行此操作,但是默认情况下它不起作用。


这似乎是评论,而不是答案。
迪伦·海斯

真的不是你在说什么。如果将控制器命名为Area1XController,则可以执行以下操作:domain.com/Area1X/1,创建一个控制器:Area2XController,然后使用domain.com/Area2X/1对其进行访问。最大的问题是为什么您仍然要这样做。区域名称是抽象的,它对用户什么也没说。如果您说4个区域,则最好使用功能用途名称。
Herman Van Der Blom 2015年

0

我同意肖恩·威尔逊(Shaun Wilson)的回答(最高答案),但不知道为什么,因为我有点困惑,仍然尝试理解以下(可能是错误的)预感-

  • 使用WebAPI Controller将JSON数据传递到客户端,以便客户端可以处理视图操作。此过程不需要视图,而只需返回对所谓方法的响应(即javascript请求),以便客户端可以处理任何客户端操作。
  • 当您需要在page_load期间或之后使用数据来操纵视图时(例如,不适用于SPA应用程序),请使用MVC控制器。

您看,我只是不知道自己在这里是多么不正确,并感到困惑,因为Shaun的回答的最后一行指出:“我使用MVC控制器来处理基本的浏览器路由和SPA的传递。” -当我以为它是接收JSON格式响应的JavaScript方法时,也许我并不完全了解一个宁静的客户端。这是Stackoverflow中最近的帖子,该帖子与我的问题的答案密切相关,因此我在回答这篇文章,而不是重复问题。


使用MVC控制器交付视图 ”,您可以将SPA包装到MVC部分中,以组成视图。ASP.NET MVC开发人员应该理解此概念。您可以在视图生成(例如,服务器端处理)期间利用常规的Razor + ASP.NET工具将HTML + JS呈现给客户端。许多开发人员在这里会遇到的问题是,静态HTML + JS文件并不是使SPA成为SPA的原因。有时内容需要是动态的,并且特定于用户,但是所有框架都倾向于偏离这一事实。“ SPA”和“ MVC”不是互斥的。
肖恩·威尔逊

0

在这种情况下,我建议使用WebApi,因为它非常适合基于Java脚本请求传输此类数据。通常,我将开发WebApi控制器,以便它们返回JSON友好对象,然后可以使用Javascript轻松解析该对象。

您想在MVC控制器上执行某种操作的唯一实时时间是,您想生成一些HTML并用Javascript调用替换页面的某些部分。

例如:

您有一个JQuery UI Datepicker,一旦选择,它就会生成一个单选按钮列表,这些单选按钮代表所选日期的事件。

在这种情况下,您可以使用WebApi返回一些JSON,然后使用Javascript生成必要的HTML,但是通常,使用Javascript创建许多HTML是一种不好的做法。最好让C#构建HTML,然后通过局部视图将其返回,因为这样您就不太可能在Javascript解析中遇到错误。更不用说它使HTML易于编写。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.