ASP.NET Core框架學習
參考:
蔣金楠:書籍《ASP.NET Core 3框架揭祕》、部落格園 :ASP.NET Core 3框架揭祕
樑桐銘:書籍《深入淺出 ASP.NET Core》、部落格園:從零開始學 ASP.NET Core 與 EntityFramework Core
System.Configuration 名稱空間:包含提供用於處理配置資料的程式設計模型的型別
- Configuration 類
啟動流程簡單說明
參考:
ASP.NET Core管道詳解[5]: ASP.NET Core應用是如何啟動的?[上篇]
ASP.NET Core管道詳解[6]: ASP.NET Core應用是如何啟動的?[下篇]
流程簡單說明如下:
- 建立asp.net core專案後預設是一個應用臺控制程式,入口是Program類的Main方法
- 在Main方法內呼叫了一個建立主機的方法CreateHostBuilder,此方法做了下面兩件事
- CreateDefaultBuilder:建立通用主機
- ConfigureWebHostDefaults:使用預設值
Program類程式碼如下:
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); }
以上是流程簡單說明,更詳細看下面的主機、託管、啟動類、配置等
主機
ASP.NET Core 應用在啟動時構建主機,主機是封裝了應用的所有資源,例如:
- HTTP 伺服器實現
- 中介軟體元件
- 日誌
- 依賴關係注入 (DI) 服務
- 配置
有兩種主機,推薦使用通用主機
使用 Host.CreateDefaultBuilder (String[]) 方法建立通用主機
參考:CreateDefaultBuilder:使用預配置預設值初始化HostBuilder類的新例項
以下預設值將應用於返回的HostBuilder:
- 將設定ContentRootPath為的結果GetCurrentDirectory()
- IConfiguration從 "DOTNET_" 字首的環境變數載入主機
- IConfiguration從提供的命令列引數載入主機
- IConfiguration從 "appsettings.js" 和 "appsettings. []" 載入應用EnvironmentName。json
- IConfigurationEnvironmentName使用條目程式集在 "開發" 時從使用者機密載入應用
- IConfiguration從環境變數載入應用
- IConfiguration從提供的命令列引數載入應用
- 配置ILoggerFactory以記錄到控制檯、除錯和事件源輸出
- 為 "開發" 時在依賴關係注入容器上啟用作用域驗證EnvironmentName
反編譯檢視CreateDefaultBuilder(String[])方法的原始碼
// Microsoft.Extensions.Hosting.Host using System.IO; using System.Reflection; using System.Runtime.InteropServices; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.EventLog; public static IHostBuilder CreateDefaultBuilder(string[] args) { HostBuilder hostBuilder = new HostBuilder(); hostBuilder.UseContentRoot(Directory.GetCurrentDirectory()); hostBuilder.ConfigureHostConfiguration(delegate(IConfigurationBuilder config) { config.AddEnvironmentVariables("DOTNET_"); if (args != null) { config.AddCommandLine(args); } }); hostBuilder.ConfigureAppConfiguration(delegate(HostBuilderContext hostingContext, IConfigurationBuilder config) { IHostEnvironment hostingEnvironment = hostingContext.HostingEnvironment; config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).AddJsonFile("appsettings." + hostingEnvironment.EnvironmentName + ".json", optional: true, reloadOnChange: true); if (hostingEnvironment.IsDevelopment() && !string.IsNullOrEmpty(hostingEnvironment.ApplicationName)) { Assembly assembly = Assembly.Load(new AssemblyName(hostingEnvironment.ApplicationName)); if (assembly != null) { config.AddUserSecrets(assembly, optional: true); } } config.AddEnvironmentVariables(); if (args != null) { config.AddCommandLine(args); } }).ConfigureLogging(delegate(HostBuilderContext hostingContext, ILoggingBuilder logging) { bool num = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); if (num) { logging.AddFilter<EventLogLoggerProvider>((LogLevel level) => level >= LogLevel.Warning); } logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging")); logging.AddConsole(); logging.AddDebug(); logging.AddEventSourceLogger(); if (num) { logging.AddEventLog(); } }).UseDefaultServiceProvider(delegate(HostBuilderContext context, ServiceProviderOptions options) { bool validateOnBuild = (options.ValidateScopes = context.HostingEnvironment.IsDevelopment()); options.ValidateOnBuild = validateOnBuild; }); return hostBuilder; }View Code
託管Web應用程式
Host.ConfigureWebHostDefaults:使用預設值配置IHostBuilder來託管Web應用程式
以下預設值應用於IHostBuilder:
- 使用Kestrel作為Web伺服器,並使用應用程式的配置提供程式對其進行配置
- 將WebRootFileProvider配置為在開發過程中包括入口程式集引用的專案中的靜態Web資產
- 新增HostFiltering中介軟體
- 如果ASPNETCORE_FORWARDEDHEADERS_ENABLED = true,則新增ForwardedHeaders中介軟體,
- 啟用IIS整合
- 通過UseStartup指定網路主機要使用的啟動型別
啟動類Startup
啟動類中就是兩個方法,一個是依賴注入和服務註冊ConfigureServices,一個是中介軟體配置Configure
- ConfigureServices (IServiceCollection services):依賴注入和服務註冊,例如資料庫上下文、控制器、其他的依賴注入等
- Configure (IApplicationBuilder app, IWebHostEnvironment env):用於指定應用響應 HTTP 請求的方式。 可通過將中介軟體元件新增到 IApplicationBuilder 例項來配置請求管道,例如路由、認證、跨越等
生成專案的Startup 類的程式碼一般如下:
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.HttpsPolicy; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace WebRazor { 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.AddRazorPages(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment 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.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); }); } } }View Code
配置
概念
ASP.NET Core 中的配置是使用一個或多個配置提供程式執行的。配置提供程式使用各種配置源從鍵值對讀取配置資料:
- 設定檔案,例如 appsettings.json
- 環境變數
- Azure Key Vault
- Azure 應用程式配置
- 命令列引數
- 已安裝或已建立的自定義提供程式
- 目錄檔案
- 記憶體中的 .NET 物件
讀取自定義的Json配置檔案
參考:檔案配置提供程式
在Program類的後面新增紅色的程式碼,如下:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }) .ConfigureAppConfiguration((hostingContext, config) => { config.AddJsonFile("appsettings22.json", optional: true, reloadOnChange: true); });
模型驗證
參考:模型驗證
認證與授權
參考:關於WEB Service&WCF&WebApi實現身份驗證之WebApi篇
認證
全域性認證
單頁面SAP認證
使用 SPA 標識--.net core3.0起
授權
角色授權
策略授權
ASP.NET Core 中的區域Areas
ASP.NET Core MVC
工作原理:
啟動入口
Global.asax ==》Startup.cs
Global.asax 下面是一個MvcApplication類整合,該類繼承System.Web.HttpApplication,類下面是一個Application_Start方法,Application_Start方法中包含註冊區域、註冊全域性的Filter、註冊路由、合併壓縮、打包工具Combres。
HttpApplication類:定義對 ASP.NET 應用程式內所有應用程式物件公用的方法、屬性和事件。此類是使用者在 Global.asax 檔案中定義的應用程式的基類
簡單的流程
使用者請求是通過【檢視V】進入==》通過【控制器C】處理==》從【模型M】獲取資料==》最後返回給【檢視V】。
也知道ASP.NET MVC中的約定可以通過修改配置來修改。
疑問
控制器、檢視、模型是怎麼根據約定來傳遞資料的
當時有一個疑問困惑好久,就是資料是怎麼通過控制器中傳送到檢視的?
雖然知道能根據控制器內的方法來識別對應的檢視名稱,但是控制器方法的return是怎麼把模型資料傳送到檢視的@model,當時記得自己折騰好久都沒整明白,百度搜索找到很少相關,最後看到《ASP.NET MVC 5框架揭祕》這本書才知道是和檢視引擎ViewEngine有關,檢視引擎會把控制器繫結的資料和檢視關聯起來
MVC中的http
修改約定
只搜尋cshtml,預設會搜尋多種檢視檔案
在Global.asax中增加:
/配置檢視搜尋位置、檔案型別,以提高效能
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new CustomLocationViewEngine());
然後把CustomLocationViewEngine.cs檔案放到App_Start中
配置類/註冊類:
Global.asax 下面類的方法內的註冊資訊是怎麼被框架載入識別的?
ps:框架已經鎖定好MvcApplication、Application_Start的名稱的了,如果更改名稱就會報錯,也就是說只要在框架制定的方法中新增方法,框架在第一次啟動時會自動載入Application_Start內的方法。
部署到IIS
參考:使用 IIS 在 Windows 上託管 ASP.NET Core
安裝.net core託管捆綁包,下載對應版本:當前 .NET Core 託管捆綁包安裝程式(直接下載)
雙擊應用程式成,改為:無託管程式碼
如果是64位的:滑鼠右鍵=》設定應用程式池預設設定,啟用32位應用程式這裡要改為Lalse
標識設定為有許可權的賬號
Kestrel Web伺服器
參考:官方文件Kestrel
http證書
要用dotnet run啟動專案
注意:此方法只是http能使用,而且需要網絡卡在使用的狀態(因為是),https還是不能使用,還需要繼續深入瞭解https
在專案檔案下用命令(dotnet run)啟動時,大部分瀏覽器(IE不會)會報錯:ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY
埠要根據實際設定,可以檢視Properties資料夾下的檔案launchSettings.json
Program類要新增下面紅色程式碼,這裡只是埠的方式,還有更多方式(如TCPSocket、Limits等),可以參考官方文件,
或者參考官方教程的示例程式碼,資料夾路徑:aspnetcore\fundamentals\servers\kestrel\samples\3.x\KestrelSample
埠如果不設定可以用0,就是隨機埠
using System.Net; //要引用的名稱空間 public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>() .ConfigureKestrel(serverOptions => { serverOptions.Listen(IPAddress.Loopback, 5001); //埠為0就是隨機埠 }); });
然後專案檔案的位址列中輸入cmd進入命令視窗,然後通過命令啟動專案:dotnet run,注入,不能直接用vs啟動,否則還是不能訪問
然後只能用紅色框內的地址訪問:http://127.0.0.1:5001/,(注意:用本機的https://localhost訪問還是會失敗)
釋出後的生產環境
好像說需要安裝https證書,具體還要驗證。
不過按上面設定後,釋出後也能正常使用,安全問題???
檢視元件
參考:
檢視元件封裝:.Net MVC&&datatables.js&&bootstrap做一個介面的CRUD有多簡單--鄒瓊俊
ConfigurationBuilder()
AddJsonFile
ConfigureWebHostDefaults