1. 程式人生 > 實用技巧 >ASP.NET Core框架學習

ASP.NET Core框架學習

參考:

官網文件:ASP.NET Core

深入探究ASP.NET Core Startup初始化

蔣金楠:書籍《ASP.NET Core 3框架揭祕》、部落格園 :ASP.NET Core 3框架揭祕

樑桐銘:書籍《深入淺出 ASP.NET Core》、部落格園:從零開始學 ASP.NET Core 與 EntityFramework Core

ASP.NET Core跨平臺 技術內幕

ASP.NET MVC從請求到響應發生了什麼

ASP.NET/MVC/Core的HTTP請求流程

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:使用預設值
      配置
      IHostBuilder來託管Web應用程式,指定Startup類

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

反編譯檢視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起

使用identityserver4

授權

角色授權
策略授權

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