作为一个Windows系统下的开发者,我对于Core的使用机会几乎为0,但是考虑到微软的战略规划,我觉得,Core还是有先了解起来的必要。
因为,目前微软已经搞出了两个框架了,一个是Net标准(.NetFramework),一个是Net Core。
而新特性的更新几乎都是在Net Core这个框架中。
所以,考虑到未来,一旦Core完善了,那微软肯定会放弃现在的.NetFrameWork。
因此,.Net程序员集体改用Net Core,想来,一定是大趋势。
所以让我们怀着探索的精神来看看Asp.Net Core Web应用程序吧。
创建Asp.Net Core项目
首先,我们先来创建一个Asp.Net Core Web应用程序项目,然后一起探索。
打开Visual Studio创建项目,选择Asp.Net Core Web应用程序,如下图:
然后选择Asp.Net Core Web应用程如下图:
然后我们得到了这样一个布局的项目,如下图:
可以看到,项目中有四个文件和两个文件夹(Page、wwwroot)。
其中wwwroot文件夹很特别,图标和其他的文件夹不一样,不过依然可以修改他的名称,修改名称后,文件夹图标会变回普通的图标,不过既然是特殊图标,想来一定有特殊意义,我们稍后再研究,先接着向下浏览Page文件夹。
Page文件夹展开后,发现里面有很多页面,因此,很明显,它就是存储页面的地方了,页面内容我们稍后再看,现在,我们先看看项目最外面的四个文件。
Program.cs
看到这个文件我也很奇怪,Web是依赖IIS部署,AspNet中是没有Program的,那么Core中为什么多出了个Program文件呢?我们调查一下。
原来AspNetCore有一个自带的服务器,叫做Kestrel 。
什么是自带服务器呢?就好比我们创建了一个WCF服务,但又不想挂IIS上,就自己建一个ServiceHost来挂服务。
但Kestrel 明显更高级,它还支持与反向代理服务器(如 Internet Information Services (IIS)、Nginx 或 Apache)结合使用。
什么是【反向代理服务器】呢?就是由与IIS类似的服务器,先接收来自网络的 HTTP 请求,然后再将这些请求转发到 Kestrel,最后由Kestrel来实现调用,调用流程如下图所示。
调查到这里,我做大致可以猜出了Program.cs是干什么的了——它应该是用来启动Kestrel 这个服务器的。
现在我打开Program.cs,发现如下代码。
public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .Build();
个人认为这段代码很坑,这是一个函数的简写,但又没起到简写的作用,还容易扰乱初学者,所以我们做一下修改,如下:
public static void Main(string[] args) { BuildWebHost(args).Run(); } public static IWebHost BuildWebHost(string[] args) { return WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .Build(); }
看修改后代码,我们就很明确了,Main函数启动,调用BuildWebHost函数,故名思意,这是一个创建网站服务器的函数,返回值是IWebHost。
然后,我们看到了,在Main函数使用BuildWebHost函数返回的IWebHost的实例,执行其下的Run方法。
到此,已经很明确了,Program就是启动服务器用的。
Startup.cs
这个文件我们相对比较熟悉,它是项目启动时便会调用的文件,功能有很多,下面看下系统为我们生成的代码。
public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.AddMvc(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseBrowserLink(); app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); } app.UseStaticFiles(); app.UseMvc(); } }
我们看到了三个函数,现在,我们简单的为三个函数打一下断点,启动一下网站。
很简单的得出,三个函数的运行顺序是Startup——>ConfigureServices——>Configure。
构造函数是简单的赋值,我们跳过它,来看ConfigureServices。
可以看到ConfigureServices里只调用了services.AddMvc(),查看官方介绍,原来这个方法是将Mvc服务添加到指定的服务集合中。