ApiController和ASP.NET MVC中控制器的区别

我一直在玩ASP.NET MVC 4测试版,我现在看到两种类型的控制器: ApiControllerController

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

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

由于现在我们可以使用两个控制器,请有人指出在哪些情况下去相应的控制器。


使用Controller来渲染你的普通视图。 ApiController操作仅返回序列化并发送到客户端的数据。

链接在这里

引用:

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

ApiControllers专门用于返回数据。 例如,他们负责将数据透明地序列化为客户请求的格式。 此外,它们默认遵循不同的路由方案(如:将URL映射到操作),按惯例提供REST-ful API。

你可以使用控制器而不是使用ApiController进行一些(?)手动编码。 最终,两个控制器都建立在ASP.NET基础之上。 但是如今有一个REST-ful API是一个共同的要求,即创建WebAPI来简化这种API的实现。

在这两者之间做出相当简单的决定:如果您正在编写基于HTML的Web / Internet / Intranet应用程序 - 可能偶尔会发生AJAX调用返回json的情况 - 坚持使用MVC / Controller。 如果您想为系统提供数据驱动/ REST-ful接口,请使用WebAPI。 当然,您可以将两者结合起来,从一个MVC页面中获取一个ApiController cater AJAX调用。

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


你宁愿写和维护哪个?

ASP.NET MVC

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

ASP.NET Web API

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

我喜欢ASP.NET Core的MVC6将这两种模式合并为一的事实,因为我经常需要支持这两个世界。 虽然确实可以调整任何标准MVC Controller (和/或开发自己的ActionResult类)以像ApiController一样行为和表现,但维护和测试可能非常困难:最重要的是,使用Controllers方法返回ActionResult混合其他人返回raw / serialized / IHttpActionResult数据可能会从开发人员的角度来看非常混乱,特别是如果你不是单独工作,并需要让其他开发人员加快混合方法。

迄今为止,为了最大限度地减少ASP.NET非核心Web应用程序中的问题,最好的技术是将Web API软件包导入(并正确配置)到基于MVC的Web应用程序中,以便我可以同时兼顾世界:视图的Controllers ,数据的ApiControllers

为此,您需要执行以下操作:

  • 使用NuGet安装以下Web API软件包: Microsoft.AspNet.WebApi.CoreMicrosoft.AspNet.WebApi.WebHost
  • 将一个或多个ApiControllers添加到您的/Controllers/文件夹。
  • 将以下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类( Startup.csGlobal.asax.cs ,具体取决于您是否使用OWIN Startup模板)。

    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);
        // ...
    }
    

    这种方法 - 连同其优点和缺点 - 将在下面的文章中进一步解释。

    链接地址: http://www.djcxy.com/p/20523.html

    上一篇: Difference between ApiController and Controller in ASP.NET MVC

    下一篇: ASP.NET Core Web API exception handling