有好多朋友反饋看不懂我寫的開源的一個練手項目(GitHub:https://github.com/AjuPrince/Aju.Carefree)也有好多人都但願我能寫一些簡單的入門的文章,記得前幾天在羣裏有人問爲何 .Net Core 能跨平臺,在聊天中發現也有好多人在已經在使用 .Net Core ,但問他們的時候他們也表示不知道,還有好多人說既然 .Net Core 能跨平臺了爲啥還在Window上須要IIS來部署呢?所以我想經過這篇文章來試着解釋下。 (廢話很少說,下面進入正題。)ios
在Asp.Net Core 以前,Asp.Net Framework 應用程序由IIS加載,Web應用程序的入口由InetMgr.exe建立並調用託管,在初始化過程當中觸發HttpApplication.Application_Start()事件,咱們第一次執行代碼的機會是處理Application_StartGlobal.asax中的事件,但在Asp.Net Core中,Global.asax文件找不見了,被新的初始化過程所替換(回到了熟悉的控制檯應用程序)git
看上圖的我圈住的地方,證實我沒有吹牛皮。那就有好多人問了,既然是控制檯應用程序,那爲啥我沒找見.exe 程序呢?github
以圖來講明,好像正的沒有。很確定的說是真的沒有。這是爲何呢?(容我慢慢道來)json
public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>(); }
既然經過上面咱們知道了.Net Core 應用程序是控制檯應用程序,那麼咱們就很熟悉了,代碼啓動後確定會找Main()函數(方法)(其實這就是ASP.NET Core應用程序開發的根本變化),全部的ASP.NET託管庫都是從Program
開始執行。服務器
下面咱們來解析下Main->CreateWebHostBuilder()方法cookie
一、那先來看看CreateDefaultBuilder 方法 app
從圖中圈出來的註釋來看,其實已經說的很明白了,我將試着解釋下:使用預先配置的缺省值初始化WebHostBuilder類的新實例。(建議你們去看源碼)搞懂這個東西就會理解 .Net Core 跨平臺的祕密了,我簡單的說下(算是給你們起個頭,後面但願你們都去看看源碼(.Net Core 是開源的,在GitHub上能找到)),這裏方法裏其實初始化了一個Kestrel Web服務器(至於什麼是Kestrel 服務器 後面有機會再介紹),在這個方法裏默認使用系統配置文件 appsettings.json (注意,熟悉Asp.Net 的朋友們都知道有個Web.Config 配置文件,很差意思的說,在 .Net Core 中去掉了)等等。我以爲最主要的就是這兩個。函數
能夠這麼說是有了Kestrel Web服務器才使得.Net Core 能真正的跨平臺。性能
從上圖的代碼中能夠看到,初始化完了系統默認的配置以後,啓動了Startup類,那麼下面咱們就來看看這類ui
public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. 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_2); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseCookiePolicy(); app.UseMvc(); } }
這是一個乾淨的(新建的Web程序)
從頭來看,咱們發現了一個很熟悉的方法——>構造函數,再仔細一看(原來是構造函數注入,這裏就不在說IOC了,默認你們都知道。)
接下來看看ConfigureServices和Configure 這兩個方法
一、ConfigureServices
經過註釋能夠獲得(此方法由運行時調用。使用此方法向容器添加服務。)並且能夠看到這個方法0個引用,更加的說明一點註釋是不會騙人的。
這個方法的做用就是向IServiceCollection 這個集合裏添加服務,也就是說之後系統中想要什麼服務(好比MVC、Session、Cookie。。。)都添加到這個集合中。在F12看看IServiceCollection這個集合
能夠看到這個集合的命名空間,能夠說明一點(DI在.NET Core裏面被提到了一個很是重要的位置)
二、Configure 方法
經過註釋(此方法由運行時調用。使用此方法配置HTTP請求管道。)能夠了解到 這個異常之重要,此方法用於指定中間件以什麼樣的形式響應HTTP請求,網上文章都說的親求處理管道(中間件)就是在這個方法裏配置的。
借用網上的一張圖來總結。
本篇文章只爲了讓你們入門,更深刻的東西后面有時間再深刻,若有不合適的地方請反饋,本人將立刻修改!
若是以爲還不錯,還請你們點個推薦(哈哈)!
https://github.com/dotnet/corefx(.Net Core 源碼)
https://docs.microsoft.com/zh-cn/aspnet/core/release-notes/aspnetcore-2.2?view=aspnetcore-3.0(官方文檔)