zoukankan      html  css  js  c++  java
  • ASP.NET MVC中的ApiController和Controller之间的区别

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

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

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

    您可以使用Controller而不是带有一些(?)手动编码的ApiController来执行任何操作。 最后,两个控制器都建立在ASP.NET基础之上。 但是,拥有REST-ful API是如此普遍的要求,即创建WebAPI是为了简化这种API的实现。

    在两者之间做出决定相当简单:如果你正在编写一个基于HTML的web / internet / intranet应用程序 - 可能偶尔会在这里和那里返回json的AJAX调用 - 坚持使用MVC / Controller。 如果要为系统提供数据驱动/ REST-ful接口,请使用WebAPI。 当然,您可以将两者结合起来,从MVC页面获得ApiController来处理AJAX调用。

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


    在两者之间做出决定相当简单:如果你正在编写一个基于HTML的web / internet / intranet应用程序 - 可能偶尔会在这里和那里返回json的AJAX调用 - 坚持使用MVC / Controller。 如果要为系统提供数据驱动/ REST-ful接口,请使用WebAPI。 当然,您可以将两者结合起来,从MVC页面获得ApiController来处理AJAX调用。   基本上控制器用于mvc和api-controller用于Rest-您可以根据需要在同一程序中使用API


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

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


    你宁愿写作和维护哪个?

    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 Startup.cs(和/或开发您自己的Global.asax.cs类)来行动&amp; 表现得像ApiController,它可能很难维护和测试:最重要的是,让控制器方法返回ActionResult与其他人混合返回原始/序列化/ IHttpActionResult数据从开发人员的角度来看可能非常混乱,特别是如果你' 不要单独工作,需要让其他开发人员加快这种混合方法的速度。

    到目前为止,我在ASP.NET非核心Web应用程序中最小化该问题的最佳技术是将Web API包导入(并正确配置)到基于MVC的Web应用程序中,因此我可以充分利用这两者 世界:Startup.cs为视图,Global.asax.cs为数据。

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

    • 使用NuGet安装以下Web API包:Startup.csGlobal.asax.cs
    • 将一个或多个ApiControllers添加到Startup.cs文件夹中。
    • 将以下WebApiConfig.cs文件添加到您的Startup.cs文件夹:

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

    我在博客上写的这篇文章进一步解释了这种方法及其优缺点。


    最大的区别就是 webapi 没有 view

    Web API是一种无限接近于RESTful风格的轻型框架,且不是微软提出来的,微软在.NET上实现了这中框架—Asp.Net Web API

     Web API 和 MVC可以说是两个不同的东西。Web API更倾向于基于HTTP协议的服务,直接返回用户的数据请求。MVC是建站的一种框架,倾向于返回用户的页面请求。
    我总结了以下 ASP.NET Web API 的特性,更能说明Web API是一种数据请求框架:
    ASP.NET Web API 可以根据请求报文来返回的相应数据格式。包括JSON和XML。

    ASP.NET Web API 单独做数据请求和MVC做页面请求可以让Web前端和后台更好的解耦,减少开发难度。

    Web API 可以更好地用在移动端网页、桌面端网页或者桌面程序。

    Web API 的宿主可以选择多样:WebHost,,ConsoleHost,甚至是windows Services。
    类似可以理解成ashx和webform的区别

    MVC的主要使用场景在于Web站点的开发,他在后端实现了一套完整的MVC开发框架,能提供方便的页面开发,默认使用Razor视图引擎,提供了后端html构造,用户可以方便地开发出带页面的站点。
    而WebAPI主演提供了一套RestfulAPI的开发框架,提供了较为完整的http语义支持,主要用来做开放API,更抽象,更不注重View的生成。
    从实现的角度看,虽然他俩捆绑在一起,但是两者处理管线还是不同的。


    Api顾名思义就是接口,MVC 控制器,数据模型,视图,两者最直接的区别就是视图的区别,mvc可以直接用数据绑定到视图上,很快的完成Ui的创建,Api主要是提供一些接口,通常用Json数据返回结果,UI视图界面就可以多种多样,跨站等等,跨语言等等


    MVC中Controller和ApiController过滤器以及Swagger问题

     

    MVC中的两种控制器:

    ApiController-->System.Web.Http.ApiController

    Controller-->System.Web.Mvc.Controller

    对应的过滤器命名空间:

    ApiController--> System.Web.Http.Filters-->example: System.Web.Http.Filters.IExceptionFilter

    Controller-->System.Web.Mvc-->example: System.Web.Mvc.IExceptionFilter

    须对应上,否则过滤器不会生效。

    Swagger问题:使用Swashbuckle不支持System.Web.Mvc.Controller

  • 相关阅读:
    大数据量表中,增加一个NOT NULL的新列
    我,属羊...
    打包发布 Qt Quick/Widgets 程序
    C++ 简单的UDP客户端与服务端
    C++ 半同步半异步的任务队列
    键盘鼠标(PS2)模拟器驱动及Demo
    BAT 非右键方式以管理员身份运行批处理
    C++多种方法枚举串口号
    c++ 宏定义调用不定参数的函数
    C++ 调用Python文件方法传递字典参数并接收返回值
  • 原文地址:https://www.cnblogs.com/wfy680/p/15385722.html
Copyright © 2011-2022 走看看