ASP.NETCore是一个新的开源和跨平台的框架,用于构建如Web应用、物联网(IoT)应用和移动后端应用等链接到互联网的基于云的现代应用程序。ASP.NET Core应用可运行于.NET Core和完整的.NET Framework之上。构建它的目的是为那些部署在云端或者内部运行的应用提 供一个优化的开发框架。它由最小开销的模块化的组件构成,所以在构建解决方案的同时能够 保持灵活性。咱们能够在Windows、Mac和Linux上跨平台开发和运行本身的ASP.NET Core 应用。html
ASP.NETCore 开源在 GitHub 上。ASP.NET Core有一些架构上的改变,这些改变使得它成为一个更为精简而且模块化的框架。ASP.NET Core再也不基于System.Web.dll。当前它基于一系列颗粒化的,而且有良好构建的 NuGet包。这一特色可以让你经过仅仅包含须要的NuGet包的方法来优化你的应用。一个更小 的应用程序接口经过“只为你须要的功能付出”(pay-for-what-you-use)模型得到的好处包括: 可靠的安全性、简化服务、改进性能和减小成本。git
经过ASP.NET Core能够得到的改进以下:github
使用VS 2017新建一个Web应用,打开VS 2017建立一个新的解决方案,在解决方案中新建一个项目,在添加新项目窗口中选择 .NET Core,选择ASP.NETCore Web应用程序,以下图所示:web
这里的实例咱们使用 Web Application (MVC) 框架版本为 .NET Core 2.1 以下图所示:后端
一个ASP.NET Core 应用其实就是在 Program 类的 Main方法调用 WebHost.CreateDefaultBuilder方法,建立了一个默认的Web应用程序宿主(Web服务器)。相比于.NET Core 1.0 在.NET Core 2.x 少了许多配置,新的方式已经隐藏了不少细节, 在WebHost.CreateDefaultBuilder这个函数内部帮助咱们完成了大部分的配置工做(启用了Web服务器 UseKestrel、配置内容根目录 UseContentRoot等)。安全
在下面的代码中,Main方法建立了一个默认的Web服务器,并指定Startup类(UseStartup)的方法。下面会讲解更多关于 Startup 的内容。Build 和 Run 方法构建了用于宿主应用程序的 IWebHost,而后启动它来监听传入的HTTP请求。服务器
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
namespace WebApplicationDome
{
public class Program {
public static void Main(string[] args) {
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
}
ASP.NET Core 托管模式并不直接监听请求,而是依赖于一个 HTTP Server 实现来转发请求到应用程序。这个被转发的请求会以一组 feature 接口的形式被包装,而后被应用程序组合到一个 HttpContext 中去。ASP.NET Core 包含了一个托管的跨平台Web服务器:Kestrel,它每每会 被运行在一个如 IIS 或者 Nginx 的生产 Web 服务器以后。cookie
WebHostBuilderExtensions 的 UseStartup 方法为你的应用指定了 Startup 类。
Startup类是应用程序的入口(entrypoint),这个类能够用来定义请求处理管道和配置应用需耍的服务。架构
Startup 类必须是公开的 (public)。
Startup类可以选择性地在构造函数中接受经过依赖注入提供的依赖项。
Startup类必须定义 Configure方法,可选择定义一个 ConfigureServices方法,这些方法将在应用程序启动时被调用:app
public class Startup {
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services) {
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
}
}
在ASP.NETCore中,Startup类提供了应用程序的入口,并且在全部应用程序都有Startup类。可能会存在特定环境的启动类和方法,但不管如何,Startup 类都将被充当为应用程序的启动点。
ConfigureServices 方法用于定义应用程序所使用的服务。经过依赖注入可将服务加入服务容器(IoC容器),使其在应用程序中可用。正如 Startup 类能将指定的依赖项做为其方法参数——而不足硬编码(hard-coding)来实例化特定实现,在应用程序中的其余类均可以作到这一点。经过在 IServiceCollection 上使用扩展方法来包装须要大量配置细节的 ConfigureServices。在下面的例子(使用了默认的Web应用程序MVC模板)中看到 ConfigureServices 方法中有个 AddMvc 的扩展方法被用于设罝应用程序可以使用MVC服务:
public void ConfigureServices(IServiceCollection services) {
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
Configure方法用于指定ASP.NET应用程序将如何响应每个HTTP请求。简单来讲,你能够配置每一个请求都接收相同的响应。然而,大多数实际的应用程序都须要比这更多的功能。更复杂的管道配置能够封装于中间件(middleware)中,并经过扩展方法添加到 lApplicationBuilder 上。Configure 方法必须接受一个 IApplicationBuilder 参数。一些额外服务,好比 IHostingEnvironment 或 ILoggerFactory 也能够被指定,而且在它们可用的状况下,这些服务将会被服务器注入进来。在下面的例子(来源于默认的Web应用程序MVC站点模板),多个扩展方法被用于配罝管道,以支持错误页、静态文件、ASP.NET MVC路由。
public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection(); // 添加HTTPS重定向中间件
app.UseStaticFiles(); // 添加静态文件中间件
app.UseCookiePolicy(); // 使用Cookie策略中间件
app.UseMvc(routes => // 使用MVC中间件
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
每一个 Use 扩展方法都会把一个中间件加入请求管道中。例如,UseMvc扩展方法增长路由中间件请求管道,并配置MVC为默认处理程序。
在下一节中间件,将会介绍更多有关中间件的信息,包括使用 IApplicationBuilder 来定义请求管道,建立本身的自定义中间件。
ASP.NETCore在应用程序启动期间提供了一些应用服务和对象。使用这些服务的方法很是简单,只要在 Startup 类的构造函数中包含合适的接口,或是在它的 Configure方法、ConfigureServices方法中包含合适的接口便可。下面定义了在Startup类中对每一个方法可用的服务。框架服务和对象包括以下内容:
①. IApplicationBuilder
被用于构建应用程序的请求管道。只能在 Startup 中的 Configure方法里使用。
②. IApplicationEnvironment
提供了访问应用程序属性,相似于ApplicationNamc、ApplicationVersion以及 ApplicationBasePath。能够在Startup的构造函数和Configure方法中使用。
③. IHostingEnvironment
提供了当前的EnvironmentName、WebRootPath以及Web根文件提供者。能够在Startup的构造函数和Configure方法中使用。
④. LoggerFactory
提供了建立日志的机制。能够在 Startup的构造函数或 Configure 方法中使用,更多请阅读 Logging。
⑤. IServiceCollection
当前容器中各服务的配置集合。只能在 ConfigureServices 方法中使用。只有在 ConfigureServices方法中配罝后,此服务在应用程序中才变得可用。
看看Startup类中按它们被调用排序的每个方法,下面的服务可做为参数:
服务是应用程序中用于通用调用的组件。服务经过依赖注入获取并使用。ASP.NET Core内置了一个简单的控制反转(IoC)容器,它默认支持构造器注入,而且能够方便地替换成你本身选用的 IoC 容器。因为它的松耦合特性,依赖注入(DI)使服务在整个应用中均可以使用。例如,Logging 在整个应用中均可用。
内容根目录是应用程序所用到的全部内容的根路径,好比它的 views 和 web内容。默认状况下,内容根目录是与宿主应用的可执行程序的应用根目录相同:其余位罝能够经过 WebHostBuilder 来设置。
应用程序的 Web根目录是项目中相似于 CSS、JS和图片文件公开、静态的资源的目录。静态文件中间件将默认只读取Web根目录和其子目录中的文件。Web根目录默认为[content root]/wwwroot。(能够经过WebHostBuilder来指定另一个地址)
ASP.NET Core使用了一个新的配置模型,用来处理简单的键值对。新的配置模型不是基于 System.Configuration 或者 web.config;相反,它足一个有序拉取数据的配置 providers。内置的构造提供支持多种不一样的文件格式,如 XML、JSON、INI和用于支持基于环境的配置环境变量,也能够本身编写实现自定义的配罝providers。
ASP.NET Core 支持在多个环境中管理应用程序行为,如开发Development,预演staging和生产Production,是ASP.NET Core中的第一级概念,并且它可使用环境变量来配置。
将在后面记录中详细介绍以上知识点。
《ASP.NET Core 跨平台开发从入门到实践》