总体来说:core mvc和mvc 存在显著的差异,但是可替换的nuget包缩小了这些差距,极少数情况需要第三方的包来解决。主要差距点如下:
- 启动上的差距:
- mvc 依赖一个模板方法 Global.asax,当收到第一个请求时,会调用 Application_Start方法,所有需要启动时运行的方法都在该方法中注册,如果使用OWIN或者Katana选项的话,会包含一个Startup.cs文件,该文件的作用和Global.asax一致。
- core mvc 使用单文件 Program.cs启动,并且简化了注册的模板方法,使用Builder .Use来注册各种中间件,使用Run来启动应用程序。
- 托管上的差距:
- mvc 托管在iis上,依赖iis的配置实现一些行为。
- core mvc 可以运行在不同平台的服务器上,内部默认包含了跨平台的Kestrel服务器。
- 静态文件托管
- mvc直接在应用中托管静态文件,目前大多数静态资源都走cdn以获取更好的性能和负载。
- core mvc 没有内置静态文件支持,需要依赖静态文件中间件,配置后在/wwwroot文件夹汇总提供服务。
- 依赖注入的支持
- mvc 中未提供默认的DI支持,可以通过第三方的 Autofac、Unity、Ninject、Castle等来实现。
- core mvc 默认支持DI,应用程序启动时调用 ConfigureServices方法来注册所有类型,当然也可以替换成第三方的DI包。
- 中间件、模块和处理程序
- mvc 内置了很多http模块,比如 身份验证和会话管理。
- core mvc 使用中间件来实现 身份验证和会话管理。
- 配置文件
- mvc 配置依赖配置文件 web.config 和 服务器的mechine.config,并存储在appsettings或者connectionStrings节点中,然后通过 ConfigurationManager 来访问。
- core mvc 使用标准的 ConfigureWebHostDefaults 方法,默认配置Json格式的文件,并且支持环境配置,appsetings.Development.json 在开发环境会替代 appsettings.json的内容。通过DI还可以通过IConfiguration接口来获取配置文件的内容。
- 路由的差异
- mvc 提供两个路由方式:路由表(RouteTable)和属性路由(RouteAttribute)
- core mvc 使用中间件UseRouting来开启,并使用UseEndpoints来注册路由规则(类似RouteTable的配置),同时也支持属性路由RouteAttribute。
- 日志差异
- mvc中没有内置的日志记录解决方案,需要引入第三方的log4net,NLog等
- core mvc内置了日志记录,通常使用注入ILogger<T>接口的方式获取实例。
- 页面渲染
- mvc 使用razor视图来实现,使用ViewModel来传递对象。
- core mvc 使用 Razor Pages ,会将操作和viewmodel组合成一个类,并链接到视图。
- WebApi的差异
- mvc 和 webapi2 在属性路由和依赖注入方面类似,但是不完全一样。
- core mvc 中 mvc 和 webapi 没有任何区别
- 身份认证的差异
- mvc 中在 app_start文件夹中 Startup.Auth.cs 中配置
- core mvc 在中间件中配置,使用UseAuthentication 和 UseAuthorization 来实现认证和授权
- 标识的差别 与 11 类似
- Controller的差别
- mvc 和webapi 支持 Controller 和ApiController.
- core mvc不在支持 ApiController、System.Web.Http 命名空间和IHttpActionResult,使用 Controller基类和 ActionResult
- Razor 语法层面的提升
- SignalR的一些提升
- 一些单元测试能力提供的提升
以上引用自微软文档:ASP.NET MVC 和 ASP.NET Core 之间的体系结构差异