asp.net core mvc剖析:啟動流程

来源:http://www.cnblogs.com/dxp909/archive/2017/02/13/6394131.html
-Advertisement-
Play Games

asp.net core mvc是微軟開源的跨平臺的mvc框架,首先它跟原有的MVC相比,最大的不同就是跨平臺,然後又增加了一些非常實用的新功能,比如taghelper,viewcomponent,DependencyInjection等,現在開始asp.net core mvc剖析之旅。 任何應用 ...


asp.net core mvc是微軟開源的跨平臺的mvc框架,首先它跟原有的MVC相比,最大的不同就是跨平臺,然後又增加了一些非常實用的新功能,比如taghelper,viewcomponent,DependencyInjection等,現在開始asp.net core mvc剖析之旅。

任何應用程式都有入口點,MVC中也如此,通過新框架創建的MVC程式里,有一個特殊的文件Program.cs,裡面包含了一個Main方法,這個方法相信大家都不陌生,控制台應用程式也有類似的Main方法,這個方式其實就是MVC程式的入口方法,那我們來看一下這個方法里主要做了什麼工作?

     public static void Main(string[] args)
        {
            var host = new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .Build();

            host.Run();
        }

  從上面的代碼我們可以看出,通過WebHostBuilder類Build了一個IWebHost對象,然後調用host.Run方法完成應用程式啟動。那我們再來看一下,WebHost是如何被Build出來的。在Hosting項目中最終找到了WebHostBuilder類的蹤影,Build方法里有幾句關鍵代碼:

 //創建應用程式依賴註入的IServiceCollection對象,這個後面會單獨去講解
var hostingServices = BuildHostingServices(); var hostingContainer = hostingServices.BuildServiceProvider();
//實例化WebHost對象 var host = new WebHost(hostingServices, hostingContainer, _options, _config);
//初始化 host.Initialize();

  在WebHost類中找到Initialize()方法,方法里調用了BuildApplication完成http請求處理管道的構建。我們來看下構建處理管道的過程

//這個方法其實是調用程式里Startup類中的ConfigureServices方法,完成服務依賴註冊
EnsureApplicationServices();
//IServer的相關操作 EnsureServer(); var builderFactory = _applicationServices.GetRequiredService<IApplicationBuilderFactory>(); var builder = builderFactory.CreateBuilder(Server.Features); builder.ApplicationServices = _applicationServices; var startupFilters = _applicationServices.GetService<IEnumerable<IStartupFilter>>(); Action<IApplicationBuilder> configure = _startup.Configure; foreach (var filter in startupFilters.Reverse()) {
  //調用Startup類中的Configure方法註冊處理中間件(middleware) configure = filter.Configure(configure); } configure(builder);

  到這裡中終於明白startup.cs類作用了。完成了基本的配置後,應用程式就可以啟動了。

  WebHost.Run方法定義是在WebHostExtensions中,作為擴展方法存在的,Run方法中調用了WebHost的Start方法,WebHost的Start方法直接調用了IServer的Start方法進行服務啟動

 Server.Start(new HostingApplication(_application, _logger, diagnosticSource, httpContextFactory));

  _application:http請求處理管道

  httpContextFactory:httpcontext工廠,每個http請求都會對應一個httpcontext對象,這個httpcontext就由這個工廠進行創建,這個工廠在HttpAbstractions項目中。

  IServer啟動方法里會啟動請求監聽,當http請求過來後,首先調用HostingApplication(IHttpApplication類型)的CreateContext創建HttpContext對象,CreateContext會依賴上面提到的httpContextFactory,HttpContext創建後就會調用HostingApplication的ProcessRequestAsync方法進行請求處理:

public Task ProcessRequestAsync(Context context)
{
  return _application(context.HttpContext);
}

  ProcessRequestAsync方法里很簡單,直接把http請求放入http處理管道進行處理。

下一篇文章會介紹KestrelServer如何監聽請求,並交給處理管道進行處理的。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、IIFE解釋 全拼Imdiately Invoked Function Expression,立即執行的函數表達式。 像如下的代碼所示,就是一個匿名立即執行函數: 二、括弧的意義 2.1 包住 的括弧的意義 這個括弧的目的,是為了把 轉化為表達式。像一些庫的源碼,喜歡用如下方式代替: 或者這種方 ...
  • 在Mvc模式大行其道的今天,後端通過各種Mvc框架實現視圖與數據模型的隔離,而前端這方面也發展迅速。vue實現了Dom與viewModel雙向綁定,使其視圖的更新影響模型,模型的更新影響視圖,你會不會覺得這就是Mvc庫呢,實則不然,因為他還差一個重要的C(也就是控制器)。以下是鄙人對Mvc的個人理解 ...
  • 什麼是Ajax Ajax(Asynchronous JavaScript and XML):翻譯成中文就是非同步的JavaScript和XML。 從功能上來看是一種在無需重新載入整個網頁的情況下能夠更新部分網頁的技術。 傳統的網頁 想要更新內容或者提交表單就要重新載入或刷新頁面。 使用ajax技術的網 ...
  • 今天進行了InfluxDB和MySQL的對比測試,這裡記錄下結果,也方便我以後查閱。 操作系統: CentOS6.5_x64InfluxDB版本 : v1.1.0MySQL版本:v5.1.73CPU : Intel(R) Core(TM) i5-2320 CPU @ 3.00GHz記憶體 :12G硬碟 ...
  • 本文分三部步講解: 資料庫安裝,資料庫創建,創建表空間與用戶 資料庫安裝 首先到官方網站根據機器要求下載必要安裝包: http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html win32_11 ...
  • 一、寫在前面 HA即(high available)高可用,又被叫做雙機熱備,用於關鍵性業務。簡單理解就是,有2台機器 A 和 B,正常是 A 提供服務,B 待命閑置,當 A 宕機或服務宕掉,會切換至B機器繼續提供服務。常見的實現高可用的開源軟體有 heartbeat 和 keepalived。 這 ...
  • 本章將和大家分享的是如果在雲伺服器上部署mvc,雲伺服器部署其實也不高大上,就和咋們在自己電腦上用iis發佈部署站點一樣,只是需要使用雲解析把自己購買的功能變數名稱解析到對應的自己的雲伺服器上,這些都是用的雲服務商提供的服務,希望大家能夠喜歡,也希望各位多多"掃碼支持"和"推薦"謝謝! » 伺服器環境描述 ...
  • ViewBag和TempData的區別 在控制器(Controller)中使用 ViewData: Controller里取數據賦值 * 前臺調用 ViewBag : Controller里取數據賦值 前臺調用: 按F12運行網站便可以看到運行結果,兩個也可以用於不分頁的新聞列表。 TempData ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...