我一直在摆弄ASP。NET MVC 4 beta和我现在看到两种类型的控制器:ApiController和Controller。

我有点困惑在什么情况下我可以选择一个特定的控制器。

例如:如果我想返回一个视图,那么我必须使用ApiController或普通控制器?我知道WCF Web API现在已经与MVC集成了。

既然现在我们可以使用两个控制器有人能指出对应的控制器的情况吗。


当前回答

你更愿意编写和维护哪一个?

ASP。NET MVC

public class TweetsController : Controller {
  // GET: /Tweets/
  [HttpGet]
  public ActionResult Index() {
    return Json(Twitter.GetTweets(), JsonRequestBehavior.AllowGet);
  }
}

ASP。网上广告

public class TweetsController : ApiController {
  // GET: /Api/Tweets/
  public List<Tweet> Get() {
    return Twitter.GetTweets();
  }
}

其他回答

Web API中的每个方法都将返回数据(JSON)而无需序列化。

然而,为了在MVC控制器中返回JSON数据,我们将返回的Action Result类型设置为JsonResult,并在我们的对象上调用JSON方法,以确保它被打包在JSON中。

使用Controller来呈现正常的视图。ApiController动作只返回已序列化并发送给客户端的数据。

这是链接

引用:

如果您使用过ASP。NET MVC,那么你已经熟悉控制器了。它们在Web API中工作类似,但是Web API中的控制器派生于ApiController类而不是Controller类。您将注意到的第一个主要区别是Web API控制器上的操作不返回视图,而是返回数据。

ApiControllers专门用于返回数据。例如,它们负责将数据透明地序列化为客户端所请求的格式。此外,它们默认情况下遵循不同的路由方案(例如:将url映射到动作),根据约定提供REST-ful API。

你可能可以使用Controller而不是ApiController来做任何事情,并使用一些(?)手动编码。最后,这两个控制器都是建立在ASP。净的基础。但是拥有一个REST-ful API在今天是如此普遍的需求,以至于WebAPI被创建来简化这样一个API的实现。

两者之间的选择相当简单:如果你正在编写一个基于HTML的web/internet/intranet应用程序——可能偶尔会在这里或那里调用AJAX返回json——坚持使用MVC/Controller。如果你想为系统提供一个数据驱动/ rest接口,可以使用WebAPI。当然,您可以将两者结合起来,使用ApiController来满足来自MVC页面的AJAX调用。

举一个真实的例子:我目前正在使用一个ERP系统,该系统为其实体提供了一个REST-ful API。对于这个API, WebAPI将是一个很好的候选。同时,ERP系统提供了一个高度ajax化的web应用程序,您可以使用它为REST-ful API创建查询。web应用程序本身可以实现为MVC应用程序,利用WebAPI获取元数据等。

I love the fact that ASP.NET Core's MVC6 merged the two patterns into one because I often need to support both worlds. While it's true that you can tweak any standard MVC Controller (and/or develop your own ActionResult classes) to act & behave just like an ApiController, it can be very hard to maintain and to test: on top of that, having Controllers methods returning ActionResult mixed with others returning raw/serialized/IHttpActionResult data can be very confusing from a developer perspective, expecially if you're not working alone and need to bring other developers to speed with that hybrid approach.

这是我迄今为止在ASP中最小化这个问题的最佳技术。NET非核心web应用程序是导入(并正确配置)web API包到基于mvc的web应用程序,所以我可以有最好的两个世界:控制器的视图,ApiControllers的数据。

为了做到这一点,你需要做以下几点:

使用NuGet安装以下Web API包:Microsoft.AspNet.WebApi.Core和Microsoft.AspNet.WebApi.WebHost。 在/Controllers/文件夹中添加一个或多个ApiControllers。 将以下WebApiConfig.cs文件添加到您的/App_Config/文件夹中:


using System.Web.Http;

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

最后,你需要注册上面的类到你的启动类(Startup.cs或Global.asax.cs,取决于你是否使用OWIN启动模板)。

Startup.cs

 public void Configuration(IAppBuilder app)
 {
    // Register Web API routing support before anything else
    GlobalConfiguration.Configure(WebApiConfig.Register);

    // The rest of your file goes there
    // ...
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    ConfigureAuth(app);
    // ...
}

Global.asax.cs

protected void Application_Start()
{
    // Register Web API routing support before anything else
    GlobalConfiguration.Configure(WebApiConfig.Register);

    // The rest of your file goes there
    // ...
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
    // ...
}

这种方法——以及它的优点和缺点——在我的博客上的这篇文章中有进一步的解释。

你更愿意编写和维护哪一个?

ASP。NET MVC

public class TweetsController : Controller {
  // GET: /Tweets/
  [HttpGet]
  public ActionResult Index() {
    return Json(Twitter.GetTweets(), JsonRequestBehavior.AllowGet);
  }
}

ASP。网上广告

public class TweetsController : ApiController {
  // GET: /Api/Tweets/
  public List<Tweet> Get() {
    return Twitter.GetTweets();
  }
}

如果你在最新的框架4.7.2中创建了一个新的web应用程序,你将默认配置它们,并可以在此基础上构建你的应用程序