ASP.NET 代碼審計

ASP.NET 官方文檔

名詞解釋

IIS(Internet Information Services)

IIS 是微軟開發的一款 Web 服務器軟件,用于在 Windows 服務器上托管和提供Web應用程序和服務。它支持 HTTP、HTTPS、FTP、SMTP 等多種協議,主要用于:

  • 托管靜態網站和動態 Web 應用程序
  • 管理和配置 Web 服務器
  • 提供安全性、性能和可擴展性支持

.NET

NET(又稱為 .NET Framework,.NET Core,.NET 5/6 等)是一個由微軟開發的開發平臺,支持多種編程語言、庫和工具,旨在幫助開發人員構建各種類型的應用程序,包括Web、桌面、移動和云端應用。它的關鍵組件包括:

  • CLR(Common Language Runtime):.NET 應用程序運行時的核心,負責內存管理、線程管理和安全性等。
  • 類庫(Class Libraries):一組預定義的類和方法,提供各種常用功能,如文件操作、數據庫連接、網絡通信等。

C#

C# 是一種由微軟開發的現代、面向對象的編程語言,主要用于開發基于 .NET 平臺的應用程序。C# 語言設計簡潔、類型安全,并且支持多種編程范式,包括面向對象編程、泛型編程和函數式編程。

ASP.NET

ASP.NET 是基于 .NET 平臺的Web開發框架,用于創建動態 Web 應用程序和 Web 服務。它提供了一組工具和庫,幫助開發者快速構建高性能、可擴展的 Web 應用。ASP.NET 包括以下幾部分:

  • ASP.NET Web Forms:早期的 Web 開發模型,使用事件驅動的編程模型,類似于 Windows Forms 。
  • ASP.NET MVC:基于模型-視圖-控制器模式的 Web 開發模型,強調分離關注點,便于測試和維護。
  • ASP.NET Web API:用于構建 HTTP 服務,可以被各種客戶端(如瀏覽器、移動設備等)調用。
  • ASP.NET Core:現代、跨平臺的高性能 Web 框架,是對 ASP.NET 的全面升級和重構,支持在 Windows、macOS 和 Linux 上運行。

ASP.NET 與 IIS、.NET 和 C# 的關系:

  • ASP.NET 是基于 .NET 平臺構建的。
    • ASP.NET 應用程序運行在 .NET 的運行時環境(如 .NET Core 或 .NET Framework)上,依賴于 CLR 進行內存管理、安全性等。
    • ASP.NET 使用 .NET 提供的豐富類庫和 API ,如文件操作、數據庫連接、網絡通信等。
    • ASP.NET 本身是 .NET 平臺的一部分,利用 .NET 平臺的底層功能和服務來構建Web應用程序。
  • C# 是開發 ASP.NET 應用程序的主要編程語言。
    • 開發者使用 C# 編寫 ASP.NET 應用程序的代碼,包括業務邏輯、數據訪問、用戶界面等。
    • ASP.NET 框架充分利用 C# 的語言特性,如面向對象編程、泛型、異步編程等,提高了開發效率和代碼質量。
    • C# 代碼可以通過 ASP.NET 框架與 HTML、CSS、JavaScript 等前端技術集成,構建完整的 Web 應用程序。
  • IIS(Internet Information Services)是 ASP.NET 應用程序的主要托管環境。
    • IIS 用于托管和管理 ASP.NET 應用程序,處理客戶端的 HTTP 請求。
    • IIS 提供了多種配置選項,支持應用程序池、站點綁定、認證和授權等功能,增強了 ASP.NET 應用程序的安全性和性能。
    • ASP.NET 應用程序在開發完成后,可以通過 IIS 進行部署和發布,使其能夠被用戶訪問。

項目結構

在 IIS 項目中,文件和目錄結構對項目的組織和管理非常重要。一個典型的 IIS 托管的ASP.NET項目的目錄結構可能如下:

MyAspNetApp/
├── wwwroot/
│   ├── css/
│   ├── js/
│   ├── images/
│   └── lib/
├── App_Data/
├── App_Start/
│   ├── BundleConfig.cs
│   ├── FilterConfig.cs
│   ├── RouteConfig.cs
│   └── WebApiConfig.cs
├── bin/
├── Content/
│   ├── css/
│   ├── images/
│   └── js/
├── Controllers/
│   ├── HomeController.cs
│   └── AccountController.cs
├── Models/
│   ├── AccountViewModels.cs
│   ├── ApplicationDbContext.cs
│   └── IdentityModels.cs
├── Views/
│   ├── Home/
│   │   ├── Index.cshtml
│   │   └── About.cshtml
│   ├── Shared/
│   │   ├── _Layout.cshtml
│   │   └── _ValidationScriptsPartial.cshtml
│   └── Account/
│       ├── Login.cshtml
│       └── Register.cshtml
├── Pages/
│   ├── Index.cshtml
│   └── Privacy.cshtml
├── Areas/
│   └── Admin/
│       ├── Controllers/
│       │   └── AdminController.cs
│       ├── Models/
│       │   └── AdminViewModels.cs
│       └── Views/
│           └── Admin/
│               ├── Index.cshtml
│               └── Settings.cshtml
├── Properties/
│   └── launchSettings.json
├── Migrations/
│   ├── 20210101010101_InitialCreate.cs
│   └── ApplicationDbContextModelSnapshot.cs
├── Logs/
│   └── log.txt
├── web.config
└── appsettings.json

根目錄

  • wwwroot:包含所有靜態文件,如HTML、CSS、JavaScript、圖片等。這是Web服務器公開訪問的目錄。
    • css:存放CSS文件。
    • js:存放JavaScript文件。
    • images:存放圖像文件。
    • lib:存放第三方庫(通常通過包管理器如npm或NuGet獲取)。

應用程序目錄

  • App_Data:存放應用程序數據文件,如數據庫文件、XML文件等。這個目錄不會被Web服務器直接公開訪問。
  • App_Start:包含應用程序啟動時運行的代碼文件,如路由配置、過濾器配置等(通常在ASP.NET MVC中使用)。
  • bin:存放編譯后的程序集(DLL文件),這些文件包含了應用程序的邏輯和代碼。
  • Content:存放靜態內容,如CSS、圖像等(類似于wwwroot目錄,但更常用于ASP.NET MVC項目)。
  • Controllers:存放控制器類文件,每個控制器負責處理特定的用戶請求(通常在ASP.NET MVC和ASP.NET Core中使用)。
  • Models:存放模型類文件,這些文件定義了應用程序的數據結構和業務邏輯。
  • Views:存放視圖文件(如.cshtml文件),這些文件定義了用戶界面布局和顯示內容(通常在ASP.NET MVC和Razor Pages中使用)。
  • Pages:存放Razor Pages文件(.cshtml),用于定義頁面內容和邏輯(主要在ASP.NET Core中使用)。
  • Shared:存放共享視圖(如布局文件、部分視圖),這些視圖可以在多個地方重用。
  • Areas:用于組織大型應用程序,將應用程序分成多個功能區,每個區域有自己的Controllers、Views、Models等。

配置文件

  • web.config:應用程序的配置文件,包含了應用程序設置、連接字符串、安全配置等。對于ASP.NET Core應用,這個文件通常比較簡單,很多配置移到了appsettings.json中。
  • appsettings.json:ASP.NET Core應用程序的配置文件,包含應用程序設置、連接字符串等,支持分層配置(如appsettings.Development.json)。

日志文件

  • Logs:存放應用程序運行時生成的日志文件。

其他

  • Properties:存放應用程序屬性和設置文件(如launchSettings.json,用于調試配置)。
  • Migrations:存放Entity Framework數據庫遷移文件,跟蹤數據庫架構的變更。

文件類型

.aspx & .aspx.cs:Web 頁面

  • .aspx:ASP.NET 頁面文件,負責顯示內容。瀏覽器直接訪問 ASPX 頁面,對應Web 頁面,由 IIS 處理成 HTML 內容輸出。
  • .aspx.cs:頁面后的代碼文件,負責處理服務器端的邏輯和動作,定義在 ASPX.CS 文件中。

例如我們定義 Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="MyApp.Default" %>
<!DOCTYPE html>
<html>
<head runat="server"><title>My ASP.NET Page</title>
</head>
<body><form id="form1" runat="server"><div><asp:Label ID="lblMessage" runat="server" Text="Hello, World!"></asp:Label></div></form>
</body>
</html>
  • <%@ Page ... %> 指令
    • Language="C#":指定頁面使用 C# 作為編程語言。
    • AutoEventWireup="true":自動將頁面事件與處理程序連接起來。
    • CodeBehind="Default.aspx.cs":指定后臺代碼文件(也就是 .aspx.cs 文件)。
    • Inherits="MyApp.Default":指定頁面的后臺代碼類(從 System.Web.UI.Page 繼承)。
  • <head runat="server">...</head>:頁面頭部,包含頁面標題等信息。
    • runat="server":表示該元素在服務器上運行,允許服務器端代碼操作該元素。
  • <form id="form1" runat="server">...</form>:服務器端表單,包含頁面上的控件。
  • <asp:Label ... />:ASP.NET 服務器控件,標簽控件用于顯示文本。
    • ID="lblMessage":控件的唯一標識符。
    • runat="server":表示該控件在服務器端運行。
    • Text="Hello, World!":控件顯示的初始文本。

Default.aspx.cs

using System;
using System.Web.UI;namespace MyApp
{public partial class Default : Page{protected void Page_Load(object sender, EventArgs e){if (!IsPostBack){lblMessage.Text = "Welcome to my ASP.NET page!";}}}
}
  • using System;using System.Web.UI;:引入命名空間,System 提供基本的類和基類定義,System.Web.UI 提供 ASP.NET 服務器控件和頁面類。

  • namespace MyApp:定義命名空間 MyApp,包含所有相關類。

  • public partial class Default : Page:定義一個部分類 Default,繼承自 System.Web.UI.Page

    • partial:允許類的定義分布在多個文件中。
  • protected void Page_Load(object sender, EventArgs e):頁面加載事件處理程序,當頁面加載時調用。

    • protected:訪問修飾符,表示該方法對派生類可見。
    • Page_Load:方法名稱,ASP.NET 中頁面加載事件的默認名稱。
    • object sender:事件發送者。
    • EventArgs e:事件參數。
  • if (!IsPostBack):檢查頁面是否是首次加載(而不是回發)。

    • IsPostBack:ASP.NET 屬性,指示頁面是否是回發。
  • lblMessage.Text = "Welcome to my ASP.NET page!";:設置標簽控件 lblMessage 的文本。

    • lblMessage:標簽控件的 ID。
    • Text:控件的文本屬性。

上述示例代碼的工作原理為:

  1. 初次加載:當用戶首次訪問 Default.aspx 頁面時,頁面會執行 Page_Load 事件處理程序,檢查 IsPostBack 屬性。如果頁面是首次加載(!IsPostBack),則設置 lblMessage 控件的文本為 "Welcome to my ASP.NET page!"
  2. 瀏覽器顯示:IIS 處理 Default.aspx 頁面,將其轉換為 HTML,并將生成的 HTML 發送到客戶端瀏覽器進行顯示。
  3. 回發處理:如果頁面是由于某些操作(例如按鈕點擊)回發的,Page_Load 事件處理程序會再次執行,但這次 IsPostBack 屬性為 true,因此不會再次設置 lblMessage 控件的文本。

.ascx & .ascx.cs:用戶控件

  • .ascx:Web 用戶控件文件(User Control),用于定義可插入到 ASPX 頁面中的控件。頭部文件聲明為控件文件。
  • .ascx.cs:用戶控件的后臺代碼文件,負責處理服務器端的邏輯和動作。

例如我們定義 MyControl.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MyControl.ascx.cs" Inherits="MyApp.MyControl" %>
<div><asp:Label ID="lblControlMessage" runat="server" Text="User Control"></asp:Label>
</div>
  • <%@ Control ... %> 指令
    • Language="C#":指定控件使用 C# 作為編程語言。
    • AutoEventWireup="true":自動將控件事件與處理程序連接起來。
    • CodeBehind="MyControl.ascx.cs":指定后臺代碼文件(也就是 .ascx.cs 文件)。
    • Inherits="MyApp.MyControl":指定控件的后臺代碼類(從 System.Web.UI.UserControl 繼承)。
  • HTML 結構
    • <div>...</div>:HTML div 元素,用于包裹控件內容。
    • <asp:Label ... />:ASP.NET 服務器控件,標簽控件用于顯示文本。
      • ID="lblControlMessage":控件的唯一標識符。
      • runat="server":表示該控件在服務器端運行。
      • Text="User Control":控件顯示的初始文本。

MyControl.ascx.cs

using System;
using System.Web.UI;namespace MyApp
{public partial class MyControl : UserControl{protected void Page_Load(object sender, EventArgs e){// 設置標簽控件的文本lblControlMessage.Text = "Hello from User Control!";}}
}
  • 命名空間和引用

    • using System;using System.Web.UI;:引入必要的命名空間,提供 ASP.NET 服務器控件和頁面功能。因為用戶控件繼承自 System.Web.UI.UserControl
  • 類聲明

    • public partial class MyControl : UserControl:定義一個名為 MyControl 的公共類,繼承自 System.Web.UI.UserControl
      • partial:允許類的定義分布在多個文件中。
  • Page_Load 方法

    • protected void Page_Load(object sender, EventArgs e):頁面加載事件處理程序,當控件所在的頁面加載時調用。
    • object sender:事件發送者。
    • EventArgs e:事件參數。
  • 設置標簽控件的文本

    • lblControlMessage.Text = "Hello from User Control!";:設置標簽控件 lblControlMessage 的文本為 "Hello from User Control!"

用戶控件創建完成后,可以將其插入到一個 ASPX 頁面中,以便在頁面中重用該控件。例如 Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="MyApp.Default" %>
<%@ Register Src="~/MyControl.ascx" TagPrefix="uc" TagName="MyControl" %>
<!DOCTYPE html>
<html>
<head runat="server"><title>My ASP.NET Page</title>
</head>
<body><form id="form1" runat="server"><div><uc:MyControl ID="MyControl1" runat="server" /></div></form>
</body>
</html>
  • <%@ Register ... %> 指令

    • Src="~/MyControl.ascx":指定用戶控件文件的位置。
    • TagPrefix="uc":指定用戶控件的標簽前綴。
    • TagName="MyControl":指定用戶控件的標簽名稱。
  • HTML 結構

    • <uc:MyControl ID="MyControl1" runat="server" />:將用戶控件插入到頁面中。
      • ID="MyControl1":控件的唯一標識符。
      • runat="server":表示該控件在服務器端運行。

上述示例代碼的工作原理為:

  1. 定義用戶控件:在 MyControl.ascx 文件中定義用戶控件的布局和內容,并在 MyControl.ascx.cs 文件中定義控件的邏輯。
  2. 插入用戶控件:在需要使用用戶控件的 ASPX 頁面中,通過 <%@ Register ... %> 指令注冊用戶控件,并通過自定義標簽將其插入到頁面中。
  3. 運行時行為
    • 當 ASPX 頁面加載時,用戶控件的 Page_Load 方法會被調用,設置標簽控件的文本。
    • 整個頁面包括用戶控件的內容將被處理成 HTML 并發送到客戶端瀏覽器進行顯示。

通過這種方式,ASP.NET 實現了頁面布局和邏輯的模塊化和復用,簡化了開發和維護。

.asmx & .asmx.cs:Web 服務文件

通俗的講就是訪問一個特定的 URL 就可以調用遠程服務臺的某個 API 。

  • .asmx:Web 服務的定義文件,描述了 Web 服務的基本信息。
  • asmx.cs:Web 服務的后臺代碼文件,包含實際的服務方法邏輯。

例如我們定義 MyWebService.asmx 如下:

<%@ WebService Language="C#" Class="MyApp.MyWebService" %>
  • <%@ WebService ... %> 指令告訴 ASP.NET 在 MyWebService.asmx 文件中使用 MyApp.MyWebService 類來處理 Web 服務請求。
    • Language="C#":指定 Web 服務使用 C# 作為編程語言。
    • Class="MyApp.MyWebService":指定實現 Web 服務邏輯的類的全名,包括命名空間。

MyWebService.asmx.cs

using System;
using System.Web.Services;namespace MyApp
{[WebService(Namespace = "http://myapp.com/")]public class MyWebService : WebService{[WebMethod]public string HelloWorld(){return "Hello, World!";}}
}
  • 命名空間和引用

    • using System;:引用必要的命名空間,提供基本的類和基類定義。
    • using System.Web.Services;:引用 ASP.NET 提供的 Web 服務命名空間,包含 Web 服務相關的類和屬性。
  • 類聲明

    • namespace MyApp:定義命名空間 MyApp,包含所有相關類。
    • public class MyWebService : WebService:定義一個名為 MyWebService 的公共類,繼承自 System.Web.Services.WebService
  • [WebService] 屬性

    • [WebService(Namespace = "http://myapp.com/")]:為 Web 服務指定一個 XML 命名空間,用于區分不同的 Web 服務。命名空間通常是一個 URL,但不一定需要指向實際存在的資源。
  • 方法聲明

    • public string HelloWorld():定義一個名為 HelloWorld 的公共方法,返回類型為 string
    • [WebMethod]:指示這個方法是一個 Web 服務方法,客戶端可以通過 Web 服務調用它。
  • 方法邏輯

    • return "Hello, World!";:該方法簡單地返回字符串 “Hello, World!”。

上述代碼的整體工作原理為:

  1. 定義 Web 服務:在 MyWebService.asmx 文件中通過 <%@ WebService ... %> 指令指定使用 MyApp.MyWebService 類來處理 Web 服務請求。
  2. 實現 Web 服務:在 MyWebService.asmx.cs 文件中定義具體的服務方法,使用 [WebMethod] 屬性標識這些方法,使其可以通過 Web 服務調用。
  3. 運行時行為
    • 當客戶端請求 MyWebService.asmx 時,ASP.NET 將請求路由到 MyApp.MyWebService 類。
    • 客戶端可以調用 HelloWorld 方法(http://yourserver/MyWebService.asmx/HelloWorld),服務器將執行該方法并返回結果。
    • 結果通過 SOAP 協議以 XML 格式返回給客戶端。

通過這種方式,ASP.NET 實現了服務器端方法的網絡調用,使得客戶端可以通過 Web 服務接口遠程調用這些方法,實現跨平臺和分布式應用程序的集成。

.ashx:Web 處理程序

相對于 .asmx 針對某個特定 URL 的處理程序,來說 .ashx 是針對一類 URL 的處理程序。

一般處理程序文件,用于編寫 Web 處理程序(Web Handler)。可以理解為不會顯示的 ASPX 頁面,但效率更高。ASHX 文件專門用于處理 HTTP 請求(HttpRequest)和修改 HTTP 響應(HttpResponse)。

web.config 文件中,我們需要配置 IIS 以便識別和處理 .ashx 請求。以下是相關的配置部分:

<configuration><system.webServer><handlers><add name="MyHandler" path="*.ashx" verb="*" type="MyApp.MyHandler, MyAppAssembly" resourceType="Unspecified" /></handlers></system.webServer>
</configuration>
  • <system.webServer>:配置 IIS 7 及更高版本的 Web 服務器設置。
  • <handlers>:定義 HTTP 處理程序,這些處理程序響應特定的請求。
    • <add>:添加一個新的處理程序配置。
      • name="MyHandler":處理程序的名稱。
      • path="*.ashx":指定匹配的路徑模式,這里是所有以 .ashx 結尾的請求。
      • verb="*":指定處理的 HTTP 事件(如 GET, POST),* 表示處理所有事件。
      • type="MyApp.MyHandler, MyAppAssembly":指定處理程序的類型,包括命名空間和程序集名稱。這里 MyApp.MyHandler 是處理程序類,MyAppAssembly 是該類所在的程序集名稱。
      • resourceType="Unspecified":資源類型,通常在處理程序配置中使用 Unspecified

MyHandler.ashx 文件中定義了一個處理 HTTP 請求的類,實現 IHttpHandler 接口。

using System;
using System.Web;namespace MyApp
{public class MyHandler : IHttpHandler{// 實現 ProcessRequest 方法,該方法是處理 HTTP 請求的核心邏輯public void ProcessRequest(HttpContext context){// 設置響應的內容類型為純文本context.Response.ContentType = "text/plain";// 向響應寫入內容context.Response.Write("Hello, this is an ASHX handler.");}// 指示處理程序是否可以重用public bool IsReusable{get { return false; }}}
}
  • 命名空間和引用
    • using System;using System.Web;:引用必要的命名空間,提供 ASP.NET 處理程序功能。
  • 類聲明
    • public class MyHandler : IHttpHandler:定義一個名為 MyHandler 的公共類,實現 IHttpHandler 接口。
  • ProcessRequest 方法
    • public void ProcessRequest(HttpContext context):這是 IHttpHandler 接口中必須實現的方法,用于處理傳入的 HTTP 請求。
    • HttpContext context:提供對當前 HTTP 請求的所有 HTTP 特定的信息,如請求和響應對象。
    • context.Response.ContentType = "text/plain";:設置 HTTP 響應的內容類型為純文本 (text/plain)。
    • context.Response.Write("Hello, this is an ASHX handler.");:向 HTTP 響應寫入字符串內容 "Hello, this is an ASHX handler."
  • IsReusable 屬性
    • public bool IsReusable:這是 IHttpHandler 接口中必須實現的屬性,指示處理程序是否可以重用。
    • get { return false; }:返回 false 表示該處理程序實例不可重用。每次請求都會創建一個新的處理程序實例。

上述示例代碼的工作原理為:

  1. 配置處理程序:在 web.config 中配置處理程序,使 IIS 能識別并處理以 .ashx 結尾的請求,并將這些請求指派給 MyApp.MyHandler 類。
  2. 處理請求:當瀏覽器或客戶端請求 .ashx 文件時,IIS 會將該請求路由到 MyHandler 類的 ProcessRequest 方法。
  3. 生成響應
    • ProcessRequest 方法被調用,設置響應的內容類型為 text/plain
    • 向響應寫入 "Hello, this is an ASHX handler.",這段文本將被發送回客戶端。
  4. 完成請求:處理程序處理完請求后,IIS 將響應發送回客戶端,客戶端瀏覽器顯示純文本內容。

這種機制適用于需要處理簡單請求且不需要完整頁面渲染的場景,如生成動態內容(例如生成圖像、提供數據接口)或處理后臺任務。通過這種方式,可以提高響應速度和處理效率。

.cs & .dll:代碼文件

  • .cs:C# 代碼文件,通常包含公共類和業務邏輯。
  • .dll:動態鏈接庫文件,CS 文件編譯后的程序集,包含編譯后的代碼和資源。位于項目的 bin 目錄。

WebConfig 配置

web.config 是 ASP.NET 應用程序中的重要配置文件,用于定義應用程序的各種配置設置,如數據庫連接字符串、安全性設置、自定義錯誤頁面等。每個 ASP.NET 應用程序的根目錄通常都有一個 web.config 文件,該文件使用 XML 格式編寫。以下是 web.config 文件的詳細介紹:

主要功能和用途

  1. 應用程序設置:用于存儲自定義應用程序配置值。
  2. 連接字符串:用于存儲數據庫連接字符串。
  3. 安全配置:定義身份驗證和授權設置。
  4. 錯誤處理:配置自定義錯誤頁面。
  5. 模塊和處理程序:定義和配置 HTTP 模塊和處理程序。
  6. 調試和編譯設置:配置調試和編譯選項。
  7. 緩存設置:配置輸出緩存和數據緩存。
  8. 國際化和本地化設置:配置區域和語言設置。

結構示例

web.config 文件使用 XML 語法,根元素為 <configuration>。以下是一個基本的 web.config 文件結構示例:

<?xml version="1.0" encoding="utf-8"?>
<configuration><!-- 應用程序設置 --><appSettings><add key="ApplicationName" value="MyApp" /><add key="Environment" value="Production" /><add key="MaxItems" value="100" /></appSettings><!-- 連接字符串 --><connectionStrings><add name="DefaultConnection" connectionString="Data Source=myServer;Initial Catalog=myDatabase;User Id=myUser;Password=myPassword;" providerName="System.Data.SqlClient" /></connectionStrings><system.web><!-- 身份驗證配置 --><authentication mode="Forms"><forms loginUrl="~/Account/Login" timeout="30" /></authentication><!-- 授權配置 --><authorization><deny users="?" /><allow users="*" /></authorization><!-- 自定義錯誤頁面 --><customErrors mode="RemoteOnly" defaultRedirect="~/Errors/GeneralError.aspx"><error statusCode="404" redirect="~/Errors/NotFound.aspx" /><error statusCode="500" redirect="~/Errors/InternalError.aspx" /></customErrors><!-- 編譯和調試設置 --><compilation debug="true" targetFramework="4.7.2"><assemblies><add assembly="System.Web.Helpers, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /><add assembly="System.Web.Mvc, Version=5.2.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /><add assembly="System.Web.Optimization, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /></assemblies></compilation><!-- HTTP請求驗證 --><httpRuntime maxRequestLength="4096" executionTimeout="110" requestValidationMode="2.0" /><!-- 表單身份驗證 --><membership defaultProvider="SqlProvider"><providers><add name="SqlProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="DefaultConnection" applicationName="MyApp" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="1" passwordFormat="Hashed" /></providers></membership><!-- 配置角色管理 --><roleManager enabled="true" defaultProvider="SqlRoleProvider"><providers><add name="SqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="DefaultConnection" /></providers></roleManager><!-- 會話狀態 --><sessionState mode="InProc" timeout="20" /></system.web><system.webServer><!-- 模塊 --><modules><add name="CustomModule" type="Namespace.CustomModule, AssemblyName" /></modules><!-- 處理程序 --><handlers><add name="CustomHandler" path="*.custom" verb="*" type="Namespace.CustomHandler, AssemblyName" resourceType="Unspecified" /></handlers><!-- 壓縮配置 --><urlCompression doStaticCompression="true" doDynamicCompression="true" /></system.webServer><system.caching><!-- 緩存配置 --><outputCacheSettings><outputCacheProfiles><add name="Cache1Hour" duration="3600" varyByParam="none" /><add name="Cache30Minutes" duration="1800" varyByParam="none" /></outputCacheProfiles></outputCacheSettings></system.caching><!-- 國際化和本地化設置 --><system.web><globalization culture="en-US" uiCulture="en-US" /></system.web><!-- 日志配置 --><system.diagnostics><trace autoflush="true" indentsize="4"><listeners><add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="Logs\myListener.log" /></listeners></trace></system.diagnostics>
</configuration>

自定義配置節 (configSections)

<configuration><configSections><section name="myCustomSection" type="MyApp.MyCustomSection, MyAppAssembly" /></configSections><myCustomSection><add key="customKey" value="customValue" /></myCustomSection>
</configuration>
  • 作用:定義和使用自定義配置節,上面給出示例就是定義了一個名為 myCustomSection 的配置節,并使用了該配置節。
  • 示例解釋
    • name:自定義配置節的名稱。
    • type:處理該配置節的類型,包括命名空間和程序集名稱。
    • key:自定義配置的鍵。
    • value:自定義配置的值。

應用程序設置 (appSettings)

<appSettings><add key="ApplicationName" value="MyApp" /><add key="Environment" value="Production" /><add key="MaxItems" value="100" />
</appSettings>

作用:用于存儲鍵值對配置,應用程序可以通過 ConfigurationManager.AppSettings 訪問這些設置。

using System;
using System.Configuration;  // System.Configuration 命名空間包含了訪問配置文件(如 web.config 和 app.config)所需的類。class Program
{static void Main(){// 訪問 ApplicationName 設置string applicationName = ConfigurationManager.AppSettings["ApplicationName"];Console.WriteLine($"Application Name: {applicationName}");// 訪問 Environment 設置string environment = ConfigurationManager.AppSettings["Environment"];Console.WriteLine($"Environment: {environment}");// 訪問 MaxItems 設置并將其轉換為整數string maxItemsString = ConfigurationManager.AppSettings["MaxItems"];if (int.TryParse(maxItemsString, out int maxItems)){Console.WriteLine($"Max Items: {maxItems}");}else{Console.WriteLine("Max Items configuration is not a valid integer.");}}
}

連接字符串 (connectionStrings)

<connectionStrings><add name="DefaultConnection" connectionString="Data Source=myServer;Initial Catalog=myDatabase;User Id=myUser;Password=myPassword;" providerName="System.Data.SqlClient" />
</connectionStrings>
  • 作用:存儲數據庫連接字符串,應用程序可以通過 ConfigurationManager.ConnectionStrings 訪問。
    using System;
    using System.Configuration;
    // System.Data 和 System.Data.SqlClient 命名空間包含了與 SQL Server 數據庫交互所需的類。
    using System.Data;
    using System.Data.SqlClient;class Program
    {static void Main(){// 讀取連接字符串string connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;// 打印連接字符串Console.WriteLine("Connection String: " + connectionString);// 使用連接字符串連接數據庫using (SqlConnection connection = new SqlConnection(connectionString)){try{// 打開數據庫連接connection.Open();Console.WriteLine("Database connection opened successfully.");// 示例查詢string query = "SELECT TOP 1 * FROM SomeTable";SqlCommand command = new SqlCommand(query, connection);// 執行查詢并讀取結果using (SqlDataReader reader = command.ExecuteReader()){while (reader.Read()){Console.WriteLine("Data from database: " + reader[0].ToString());}}}catch (Exception ex){// 捕獲并顯示異常Console.WriteLine("Error: " + ex.Message);}finally{// 確保數據庫連接關閉connection.Close();Console.WriteLine("Database connection closed.");}}}
    }
    
  • 示例解釋
    • DefaultConnection:連接字符串的名稱。
    • connectionString:實際的數據庫連接字符串。
    • providerName:數據庫提供程序的名稱(如 System.Data.SqlClient)。

身份驗證 (system.web -> authentication)

在 ASP.NET 中,<authentication> 元素用于配置應用程序的身份驗證模式。身份驗證模式決定了應用程序如何驗證用戶的身份。常見的身份驗證模式包括:

  • Windows 身份驗證
  • Forms 身份驗證
  • Passport 身份驗證
  • None 身份驗證

Windows 身份驗證

Windows 身份驗證使用操作系統的身份驗證機制來驗證用戶。適用于內聯網應用程序,用戶在登錄到網絡時會自動進行身份驗證。

<system.web><authentication mode="Windows" />
</system.web>

HttpContext.Current.User.Identity.IsAuthenticated 可以判斷是否通過認證。

using System;
using System.Web;namespace MyApp
{public partial class Default : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){if (HttpContext.Current.User.Identity.IsAuthenticated){string username = HttpContext.Current.User.Identity.Name;Response.Write($"Hello, {username}! You are authenticated using Windows Authentication.");}else{Response.Write("You are not authenticated.");}}}
}

Forms 身份驗證

Forms 身份驗證通過顯示一個登錄表單來驗證用戶。適用于互聯網應用程序,用戶通過輸入用戶名和密碼進行身份驗證。

<system.web><authentication mode="Forms"><forms loginUrl="~/Account/Login" timeout="30" /></authentication>
</system.web>
  • mode:身份驗證模式,Forms 表示使用表單身份驗證。
  • loginUrl:登錄頁面的 URL。
  • timeout:登錄會話的超時時間(分鐘)。

我們可以定義用戶登錄界面 Login.aspx 如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Login.aspx.cs" Inherits="Account_Login" %>
<!DOCTYPE html>
<html>
<head runat="server"><title>Login</title>
</head>
<body><form id="form1" runat="server"><div><asp:Label ID="lblMessage" runat="server" ForeColor="Red"></asp:Label><asp:TextBox ID="txtUsername" runat="server" Placeholder="Username"></asp:TextBox><asp:TextBox ID="txtPassword" runat="server" TextMode="Password" Placeholder="Password"></asp:TextBox><asp:Button ID="btnLogin" runat="server" Text="Login" OnClick="btnLogin_Click" /></div></form>
</body>
</html>

對應后臺處理邏輯 Login.aspx.cs 如下:

using System;
using System.Web;
using System.Web.Security;public partial class Account_Login : System.Web.UI.Page
{protected void btnLogin_Click(object sender, EventArgs e){string username = txtUsername.Text;string password = txtPassword.Text;// 簡化驗證用戶賬號的過程,這里假設用戶名和密碼為 "admin"if (username == "admin" && password == "admin"){// 創建身份驗證票據FormsAuthenticationTicket ticket = new Forms AuthenticationTicket(1, // 版本號username, // 用戶名DateTime.Now, // 票據發出時間DateTime.Now.AddMinutes(30), // 票據過期時間false, // 是否持久性"", // 用戶數據FormsAuthentication.FormsCookiePath // Cookie 路徑);// 加密票據string encryptedTicket = FormsAuthentication.Encrypt(ticket);// 創建身份驗證 cookieHttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);// 添加 cookie 到響應Response.Cookies.Add(authCookie);// 重定向到原始請求頁面string returnUrl = FormsAuthentication.GetRedirectUrl(username, false);Response.Redirect(returnUrl);}else{lblMessage.Text = "Invalid username or password.";}}
}

此時整個用戶登錄過程如下:

  • 用戶訪問受保護資源:用戶嘗試訪問受保護的頁面或資源,但尚未經過身份驗證。
  • 重定向到登錄頁面:由于用戶未登錄,ASP.NET 會根據 web.config 中的表單身份驗證配置,將用戶重定向到 ~/Account/Login 頁面。
  • 用戶登錄:用戶在 Login.aspx 頁面上輸入用戶名和密碼,并提交表單。
  • 驗證憑據:在 Login.aspx.cs 中,驗證用戶憑據。如果驗證成功,創建并加密身份驗證票據,并將其存儲在 cookie 中。
  • 重定向到原始請求頁面:登錄成功后,用戶被重定向回他們最初請求的受保護資源頁面。

Passport 身份驗證

Passport 身份驗證使用 Microsoft 的 Passport 服務(現已更名為 Microsoft Account)進行身份驗證。適用于需要集成 Microsoft 身份驗證的應用程序。

<system.web><authentication mode="Passport"><passport redirectUrl="https://login.live.com" /></authentication>
</system.web>

在后臺代碼中,通過 HttpContext.User.Identity 獲取用戶的 Passport 身份信息。

using System;
using System.Web;namespace MyApp
{public partial class Default : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){if (HttpContext.Current.User.Identity.IsAuthenticated){string username = HttpContext.Current.User.Identity.Name;Response.Write($"Hello, {username}! You are authenticated using Passport Authentication.");}else{Response.Redirect("https://login.live.com");}}}
}

None 身份驗證

None 身份驗證模式表示不進行任何身份驗證。適用于不需要身份驗證的應用程序或僅進行匿名訪問的應用程序。

<system.web><authentication mode="None" />
</system.web>

授權 (system.web -> authorization)

<system.web><authorization><deny users="?" /><allow users="*" /></authorization>
</system.web>
  • 作用:配置用戶訪問權限。
  • 示例解釋
    • deny users="?":拒絕未認證用戶的訪問。
    • allow users="*":允許所有用戶訪問。

自定義錯誤頁面 (system.web -> customErrors)

<system.web><customErrors mode="RemoteOnly" defaultRedirect="~/Errors/GeneralError.aspx"><error statusCode="404" redirect="~/Errors/NotFound.aspx" /><error statusCode="500" redirect="~/Errors/InternalError.aspx" /></customErrors>
</system.web>
  • 作用:配置自定義錯誤頁面。
  • 示例解釋
    • mode:自定義錯誤模式,RemoteOnly 表示只有遠程請求會看到自定義錯誤頁面。
    • defaultRedirect:默認錯誤頁面。
    • error 元素:為特定的HTTP狀態碼配置自定義錯誤頁面。

編譯和調試設置 (system.web -> compilation)

<system.web><compilation debug="true" targetFramework="4.7.2"><assemblies><add assembly="System.Web.Helpers, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /><add assembly="System.Web.Mvc, Version=5.2.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /><add assembly="System.Web.Optimization, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /></assemblies></compilation>
</system.web>
  • 作用:配置編譯選項和調試設置。
  • 示例解釋
    • debug:是否啟用調試模式。
    • targetFramework:目標框架版本。
    • assemblies:手動添加的程序集引用。
    • Culture=neutral:程序集的文化信息,neutral 表示該程序集與任何特定的語言或區域無關。
    • PublicKeyToken=31BF3856AD364E35:程序集的公鑰令牌,用于唯一標識該程序集。

HTTP 請求驗證 (system.web -> httpRuntime)

<system.web><httpRuntime maxRequestLength="4096" executionTimeout="110" requestValidationMode="2.0" />
</system.web>
  • 作用:配置請求驗證和運行時設置。
  • 示例解釋
    • maxRequestLength:最大請求長度(KB)。
    • executionTimeout:請求的超時時間(秒)。
    • requestValidationMode:請求驗證模式。

HTTP 處理程序 (system.web -> httpHandlers)

<configuration><system.web><httpHandlers><add verb="*" path="*.ashx" type="MyApp.MyHandler, MyAppAssembly" /></httpHandlers></system.web>
</configuration>
  • 作用:定義 HTTP 處理程序,用于處理特定類型的 HTTP 請求。
  • 示例解釋
    • verb:處理的 HTTP 事件(如 GET, POST)。
    • path:處理的路徑模式。
    • type:處理程序的類型,包含命名空間和程序集名稱。

HTTP 模塊 (system.web -> httpModules)

<configuration><system.web><httpModules><add name="MyModule" type="MyApp.MyModule, MyAppAssembly" /></httpModules></system.web>
</configuration>
  • 作用:定義 HTTP 模塊,參與 ASP.NET 請求的處理生命周期。
  • 示例解釋
    • name:模塊的名稱。
    • type:模塊的類型,包含命名空間和程序集名稱。

ASP.NET 請求的處理生命周期事件:

  • BeginRequest:請求開始時觸發。這是請求生命周期中的第一個事件,適用于初始化任何請求特定的資源或設置。
  • AuthenticateRequest:用于對請求進行身份驗證。
  • AuthorizeRequest:用于對請求進行授權檢查。
  • ResolveRequestCache:在該階段,ASP.NET 可以嘗試從緩存中獲取響應并直接返回,以提高性能。
  • AcquireRequestState:獲取與當前請求關聯的狀態信息(例如 Session 狀態)。
  • PreRequestHandlerExecute:在 ASP.NET 頁面或 HTTP 處理程序執行之前觸發。
  • PostRequestHandlerExecute:在 ASP.NET 頁面或 HTTP 處理程序執行之后觸發。
  • ReleaseRequestState:在請求狀態(例如 Session 狀態)已更新之后觸發。
  • UpdateRequestCache:將請求的響應存儲在緩存中,以便將來的請求可以直接從緩存中獲取。
  • EndRequest:請求結束時觸發。通常用于清理資源。

下面這個 HTTP 模塊示例程序用來計算請求處理時間并顯示在網頁上。

using System;
using System.Web;namespace MyApp
{public class MyModule : IHttpModule{public void Init(HttpApplication context){// 訂閱 BeginRequest 和 EndRequest 事件context.BeginRequest += new EventHandler(OnBeginRequest);context.EndRequest += new EventHandler(OnEndRequest);}private void OnBeginRequest(object sender, EventArgs e){HttpContext context = ((HttpApplication)sender).Context;context.Items["RequestStartTime"] = DateTime.Now;}private void OnEndRequest(object sender, EventArgs e){HttpContext context = ((HttpApplication)sender).Context;DateTime startTime = (DateTime)context.Items["RequestStartTime"];DateTime endTime = DateTime.Now;TimeSpan duration = endTime - startTime;// 記錄請求處理時間string message = $"Request for {context.Request.Url} took {duration.TotalMilliseconds} ms";context.Response.Write($"<!-- {message} -->");}public void Dispose(){// 清理資源}}
}

表單身份驗證 (system.web -> membership)

<system.web><membership defaultProvider="SqlProvider"><providers><add name="SqlProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="DefaultConnection" applicationName="MyApp" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="1" passwordFormat="Hashed" /></providers></membership>
</system.web>
  • 作用:配置會員和身份驗證提供程序。
  • 示例解釋
    • defaultProvider:默認的身份驗證提供程序。
    • providers:配置具體的身份驗證提供程序。
    • SqlMembershipProvider:使用 SQL Server 作為會員存儲。

角色管理 (system.web -> roleManager)

<system.web><roleManager enabled="true" defaultProvider="SqlRoleProvider"><providers><add name="SqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="DefaultConnection" applicationName="MyApp" /></providers></roleManager>
</system.web>
  • 作用:配置角色提供程序。
  • 示例解釋
    • enabled:是否啟用角色管理。
    • defaultProvider:默認的角色提供程序。
    • providers:配置具體的角色提供程序。
      • name:提供程序的名稱。
      • type:提供程序的類型,指定具體的類。
      • connectionStringName:使用的連接字符串名稱,指向存儲角色數據的數據庫。
      • applicationName:應用程序名稱,用于區分不同應用程序的角色數據。

會話狀態 (system.web -> sessionState)

<system.web><sessionState mode="InProc" timeout="20" />
</system.web>
  • 作用:配置會話狀態管理。
  • 示例解釋
    • mode:會話狀態模式,InProc 表示會話狀態存儲在進程內。
    • timeout:會話超時時間(分鐘)。

模塊 (system.webServer -> modules)

<system.webServer><modules><add name="CustomModule" type="Namespace.CustomModule, AssemblyName" /></modules>
</system.webServer>
  • 作用:配置 HTTP 模塊。
  • 示例解釋
    • name:模塊名稱。
    • type:模塊的類型,包含命名空間和程序集名稱。

處理程序 (system.webServer -> handlers)

<system.webServer><handlers><add name="CustomHandler" path="*.custom" verb="*" type="Namespace.CustomHandler, AssemblyName" resourceType="Unspecified" /></handlers>
</system.webServer>
  • 作用:配置 HTTP 處理程序。
  • 示例解釋
    • name:處理程序名稱。
    • path:處理的路徑模式。
    • verb:處理的HTTP動詞(如GET, POST)。
    • type:處理程序的類型,包含命名空間和程序集名稱。
    • resourceType:資源類型。

handlers 應用于配置 IIS 7 及更高版本下的 HTTP 處理程序。相比于 httpHandlershandlerssystem.webServer 配置節點提供了更強大的功能,例如處理程序映射、模塊配置等。

對于上面的例子,我們可以定義 CustomHandler.cs 來實現對應的處理邏輯。

using System;
using System.Web;namespace Namespace
{public class CustomHandler : IHttpHandler{public void ProcessRequest(HttpContext context){context.Response.ContentType = "text/plain";string name = context.Request.QueryString["name"] ?? "World";context.Response.Write($"Hello, {name}! This is a custom handler.");}public bool IsReusable => false;}
}

在瀏覽器中訪問 http://yourserver/MyHandler.ashx?name=sky123 就可以獲得如下相應:

Hello, sky123! This is a custom handler.

壓縮配置 (system.webServer -> urlCompression)

<system.webServer><urlCompression doStaticCompression="true" doDynamicCompression="true" />
</system.webServer>
  • 作用:配置 URL 壓縮。
  • 示例解釋
    • doStaticCompression:是否壓縮靜態內容。
    • doDynamicCompression:是否壓縮動態內容。

緩存配置 (system.caching)

<system.caching><outputCacheSettings><outputCacheProfiles><add name="Cache1Hour" duration="3600" varyByParam="none" /><add name="Cache30Minutes" duration="1800" varyByParam="none" /></outputCacheProfiles></outputCacheSettings>
</system.caching>
  • 作用:配置輸出緩存設置。
  • 示例解釋
    • outputCacheProfiles:定義緩存配置文件。
    • name:緩存配置文件名稱。
    • duration:緩存持續時間(秒)。
    • varyByParam:根據參數變化緩存。

國際化和本地化設置 (system.web -> globalization)

<system.web><globalization culture="en-US" uiCulture="en-US" />
</system.web>
  • 作用:配置應用程序的文化和語言設置。
  • 示例解釋
    • culture:應用程序的文化設置(語言和區域)。
    • uiCulture:用戶界面的文化設置。

日志配置 (system.diagnostics)

<system.diagnostics><trace autoflush="true" indentsize="4"><listeners><add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="Logs\myListener.log" /></listeners></trace>
</system.diagnostics>
  • 作用:配置日志記錄。
  • 示例解釋
    • autoflush:是否自動刷新日志緩沖區。
    • indentsize:日志縮進大小。
    • listeners:定義日志監聽器。
    • name:監聽器名稱。
    • type:監聽器的類型。
    • initializeData:日志文件路徑。

開發模式

ASP.NET Web Forms

ASP.NET Web Forms 是微軟推出的一個基于事件驅動編程模型的 Web 應用程序框架。它允許開發者使用拖放設計和豐富的控件集快速構建動態、數據驅動的 Web 應用程序。ASP.NET Web Forms 在很大程度上隱藏了 HTML 和 HTTP 的復雜性,使得開發者可以使用類似于桌面應用程序開發的方式進行 Web 開發。

為了便于描述,這里假設有 Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server"><title>Simple Web Form</title>
</head>
<body><form id="form1" runat="server"><div><asp:Label ID="lblMessage" runat="server" Text="Hello, World!"></asp:Label><asp:Button ID="btnClickMe" runat="server" Text="Click Me" OnClick="btnClickMe_Click" /></div></form>
</body>
</html>

架構

ASP.NET Web Forms 基于以下核心組件和概念:

  • 頁面 (Page):每個 Web 表單頁面都是 System.Web.UI.Page 類的實例。
  • 控件 (Control):Web 表單頁面包含各種服務器控件,這些控件可以自動將數據綁定到 HTML 元素上。
  • 事件驅動模型:Web 表單使用事件驅動模型處理用戶交互和操作。
  • ViewState:用于在頁面回發(PostBack)之間保存頁面和控件的狀態。
  • 生命周期:ASP.NET Web Forms 頁面有一個復雜的生命周期,包括初始化、加載、驗證、事件處理和呈現等階段。

頁面生命周期

  • 頁面請求:用戶請求頁面時,ASP.NET 確定請求是首次請求還是回發(體現在 .NET 內部變量 IsPostBack)。
  • 開始階段:頁面對象初始化,但尚未恢復任何 ViewState。
  • 初始化階段:控件初始化,控件的屬性設置為初始值。對應 Page_Init 回調函數。
  • 加載階段:控件的狀態從 ViewState 中恢復。對應 Page_Load 回調函數。
  • 回發事件處理階段:處理特定控件的回發事件,例如按鈕點擊事件。
  • 呈現階段:頁面和控件將自己呈現為 HTML。對應 Page_PreRender 回調函數。
  • 卸載階段:頁面發送響應到客戶端后進行清理。對應 Page_Unload 回調函數。

頁面生命周期的處理函數主要定義在 Default.aspx 對應的 Default.aspx.cs 中:

using System;
using System.Web.UI;public partial class Default : Page
{protected void Page_Init(object sender, EventArgs e){// 頁面初始化lblMessage.Text += "Page_Init<br>";}protected void Page_Load(object sender, EventArgs e){// 頁面加載lblMessage.Text += "Page_Load<br>";}protected void btnClickMe_Click(object sender, EventArgs e){// 按鈕點擊事件lblMessage.Text = "Button clicked!<br>";}protected void Page_PreRender(object sender, EventArgs e){// 頁面呈現前lblMessage.Text += "Page_PreRender<br>";}protected void Page_Unload(object sender, EventArgs e){// 頁面卸載// 無法在這里輸出內容,因為響應已經發送到客戶端}
}

請求生命周期

請求生命周期涵蓋了整個 ASP.NET 應用程序從請求到響應的處理過程。它是應用程序級別的生命周期,定義了所有請求如何被接收、處理和返回。頁面生命周期是請求生命周期的一部分,專門處理頁面請求。它定義了頁面和控件如何初始化、加載、處理用戶輸入、呈現和卸載。

請求生命周期包含下面幾個事件:

  • 開始請求(BeginRequest):請求到達服務器,開始處理。
  • 認證請求(AuthenticateRequest):對請求進行身份驗證。
  • 授權請求(AuthorizeRequest):對請求進行授權檢查。
  • 解析請求緩存(ResolveRequestCache):嘗試從緩存中獲取響應。
  • 獲取請求狀態(AcquireRequestState):獲取與當前請求關聯的狀態信息(如 Session 狀態)。
  • 準備請求處理程序執行(PreRequestHandlerExecute):準備執行請求處理程序。
  • 執行請求處理程序(ExecuteRequestHandler):執行請求處理程序(如頁面或處理程序)。
  • 處理請求完成后事件(PostRequestHandlerExecute):請求處理程序執行完畢。
  • 釋放請求狀態(ReleaseRequestState):釋放請求狀態(如 Session 狀態)。
  • 更新請求緩存(UpdateRequestCache):將響應存儲到緩存中。
  • 結束請求(EndRequest):請求處理完成,準備返回響應。

具體事件處理函數實現定義在 Global.asax 中,有如下回調函數:

  • Application_Init:在每一個 HttpApplication 實例初始化時執行。通常用于設置應用程序范圍的配置和資源。
  • Application_Disposed:在每一個 HttpApplication 實例被銷毀之前執行。可以用于清理資源。
  • Application_Start:在應用程序初始化時執行。在 Web 應用程序的生命周期里只執行一次,用于初始化應用程序范圍的資源和設置。
  • Application_End:在應用程序結束時,在最后一個 HttpApplication 實例被銷毀之后執行。用于清理應用程序范圍的資源。
  • Session_Start:在會話開始時執行。用于初始化會話范圍的資源。
  • Session_End:在會話結束或過期時執行。用于清理會話范圍的資源。
  • Application_BeginRequest:在收到請求時第一個觸發的事件。用于初始化請求范圍的資源。
  • Application_AuthenticateRequest:當安全模塊已經建立了當前用戶的標識后執行。用于自定義身份驗證邏輯。
  • Application_AuthorizeRequest:當安全模塊已經驗證了當前用戶的授權時執行。用于自定義授權邏輯。
  • Application_ResolveRequestCache:在完成授權以便緩存模塊從緩存中提供服務時執行。用于實現自定義的緩存邏輯。
  • Application_AcquireRequestState:在獲取當前請求所關聯的當前狀態(如 Session)時執行。用于初始化與請求關聯的狀態。
  • Application_PreRequestHandlerExecute:在即將把請求發送到處理程序對象(頁面或 WebService)之前執行。用于在處理請求之前執行一些操作。
  • Application_PostRequestHandlerExecute:在處理程序對象工作完成后執行。用于在處理請求之后執行一些操作。
  • Application_ReleaseRequestState:在 ASP.NET 執行完所有請求處理程序后執行。用于保存請求范圍的狀態數據。
  • Application_UpdateRequestCache:在 ASP.NET 執行完處理程序后為了后續的請求而更新響應緩存時執行。用于實現自定義的緩存更新邏輯。
  • Application_EndRequest:在響應請求時最后一個觸發的事件。用于清理請求范圍的資源。
  • Application_PreSendRequestHeaders:在向客戶端發送 HTTP 標頭之前執行。用于在發送響應之前進行最后的修改。
  • Application_PreSendRequestContent:在向客戶端發送 HTTP 正文之前執行。用于在發送響應正文之前進行最后的修改。
  • Application_Error:在應用程序中發生未處理的錯誤時執行。用于全局錯誤處理。

Global.asax 示例如下:

<%@ Application Language="C#" %><script runat="server">void Application_BeginRequest(object sender, EventArgs e){// 處理請求開始HttpContext.Current.Response.Write("BeginRequest<br>");}void Application_AuthenticateRequest(object sender, EventArgs e){// 處理身份驗證HttpContext.Current.Response.Write("AuthenticateRequest<br>");}void Application_AuthorizeRequest(object sender, EventArgs e){// 處理授權HttpContext.Current.Response.Write("AuthorizeRequest<br>");}void Application_EndRequest(object sender, EventArgs e){// 處理請求結束HttpContext.Current.Response.Write("EndRequest<br>");}</script>

ASP.NET MVC

ASP.NET MVC(Model-View-Controller)是微軟開發的一種用于構建動態 Web 應用程序的框架,它基于 MVC 設計模式,將應用程序的不同方面(業務邏輯、用戶界面和輸入控制)分離開來,使得開發和測試更容易。

MVC 架構將應用程序分為三個主要部分:

  • 模型(Model):表示應用程序的業務邏輯和數據。
  • 視圖(View):負責呈現用戶界面(UI)。
  • 控制器(Controller):處理用戶輸入并與模型和視圖交互。

主要組件

模型(Model)

模型負責應用程序的業務邏輯和數據訪問。它與數據庫進行交互,處理數據的存儲和檢索。

示例模型類,這里只是定義了三個成員變量(MyApp/Models/Product/Product.cs):

public class Product
{public int Id { get; set; }public string Name { get; set; }public decimal Price { get; set; }
}
視圖(View)

視圖負責呈現模型的數據。它是用戶界面的一部分,使用 Razor 語法編寫 HTML。

示例視圖文件(MyApp/Views/Product/Index.cshtml):

@model IEnumerable<MyApp.Models.Product><!DOCTYPE html>
<html>
<head><title>Product List</title>
</head>
<body><h1>Products</h1><ul>@foreach (var product in Model){<li>@product.Name - @product.Price</li>}</ul>
</body>
</html>
控制器(Controller)

控制器負責處理用戶輸入,調用模型來處理數據,并返回相應的視圖。
示例控制器類(MyApp/Controllers/ProductController.cs):

using System.Collections.Generic;
using System.Web.Mvc;
using MyApp.Models;namespace MyApp.Controllers
{public class ProductController : Controller{public ActionResult Index(){var products = new List<Product>{new Product { Id = 1, Name = "Laptop", Price = 999.99m },new Product { Id = 2, Name = "Tablet", Price = 499.99m },new Product { Id = 3, Name = "Smartphone", Price = 299.99m }};return View(products);}}
}

工作原理

ASP.NET MVC 的工作原理可以分為以下幾個步驟:

  • 路由:ASP.NET MVC 使用路由來將請求映射到相應的控制器和動作方法。路由是在 MyApp\App_Start\RouteConfig.cs 中定義的。
    public class RouteConfig
    {// 此方法用于注冊應用程序中的路由public static void RegisterRoutes(RouteCollection routes){// 忽略特定資源的路由,例如 Web 資源(.axd 文件)routes.IgnoreRoute("{resource}.axd/{*pathInfo}");// 定義默認路由規則routes.MapRoute(name: "Default", // 路由名稱url: "{controller}/{action}/{id}", // URL 模式defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 默認參數值);}
    }
    
    Global.asax 文件用于應用程序級別的配置,如路由注冊。
    public class MvcApplication : System.Web.HttpApplication
    {protected void Application_Start(){AreaRegistration.RegisterAllAreas();RouteConfig.RegisterRoutes(RouteTable.Routes);}
    }
    
  • 控制器:路由系統將請求轉發給相應的控制器。控制器處理請求并與模型交互來獲取數據。
  • 模型:控制器調用模型來處理業務邏輯和數據訪問。模型返回處理后的數據給控制器。
  • 視圖:控制器將數據傳遞給視圖。視圖使用 Razor 語法生成 HTML,并將其返回給瀏覽器進行呈現。
    在這里插入圖片描述

ASP.NET Core

ASP.NET Core 是一個跨平臺、高性能的框架,用于構建現代、云優化的 Web 應用。它是對 ASP.NE T的全面重構,旨在提供更好的性能、更靈活的架構和跨平臺支持。ASP.NET Core 具有如下特點:

  • 跨平臺:可以在 Windows、macOS 和 Linux 上運行。
  • 高性能:通過優化的架構和中間件管道提供高性能。
  • 模塊化和靈活:通過依賴注入和中間件提供高度可定制和模塊化的架構。
  • 開源:由微軟和社區共同開發和維護,在 GitHub 上開源。
  • 統一的編程模型:結合了 MVC 和 Web API,簡化了開發體驗。

項目結構

ASP.NET Core 項目的結構與傳統的 ASP.NET 項目有所不同,主要文件和目錄包括:

  • Program.cs:應用程序的入口點,配置和啟動 Web 主機。
  • Startup.cs:配置請求管道和服務。
  • appsettings.json:應用程序的配置文件。
  • Controllers:控制器類,處理 HTTP 請求。
  • Models:模型類,表示應用程序的數據和業務邏輯。
  • Views:視圖文件,用于呈現 HTML 界面。
  • wwwroot:靜態文件目錄,如 CSS、JavaScript 和圖片。
MyAspNetCoreApp/
├── Controllers/
│   └── HomeController.cs
├── Models/
│   └── MyModel.cs
├── Views/
│   └── Home/
│       └── Index.cshtml
├── wwwroot/
│   ├── css/
│   ├── js/
│   └── images/
├── appsettings.json
├── Program.cs
└── Startup.cs

Program.cs 和 Startup.cs

Program.cs 文件是應用程序的入口點,負責配置和啟動 Web 主機。

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;public class Program
{   // Main 方法是應用程序的入口點,啟動 Web 主機。public static void Main(string[] args){CreateHostBuilder(args).Build().Run();}// CreateHostBuilder 方法配置 Web 主機,指定使用 Startup 類進行啟動配置。public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();});
}

Startup.cs 文件配置應用程序的服務和中間件。

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;public class Startup
{// ConfigureServices 方法用于注冊服務(如 MVC 服務)。public void ConfigureServices(IServiceCollection services){ services.AddControllersWithViews();}// Configure 方法用于配置中間件管道,定義請求如何流經應用程序。public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}else{app.UseExceptionHandler("/Home/Error");app.UseHsts();}app.UseHttpsRedirection();app.UseStaticFiles();app.UseRouting();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");});}
}

控制器 (Controllers)

控制器類(Controllers/HomeController.cs)處理 HTTP 請求并返回響應。

using Microsoft.AspNetCore.Mvc;// 控制器繼承自 Controller 基類。
public class HomeController : Controller
{// 每個方法(如 `Index` 和 `Privacy`)對應一個操作,可以返回視圖或其他類型的響應。public IActionResult Index(){return View();}public IActionResult Privacy(){return View();}
}

視圖 (Views)

視圖用于生成 HTML 響應,通常位于 Views 文件夾中,并按照控制器名稱組織。

@{ViewData["Title"] = "Home Page";
}<div class="text-center"><h1 class="display-4">Welcome</h1><p>Welcome to your new ASP.NET Core application.</p>
</div>

模型 (Models)

模型表示應用程序的數據和業務邏輯,通常位于 Models 文件夾中。

public class MyModel
{public int Id { get; set; }public string Name { get; set; }
}

中間件 (Middleware)

中間件是 ASP.NET Core 請求處理管道中的組件。每個請求依次通過這些組件進行處理。

Startup.csConfigure 方法中配置中間件:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}else{app.UseExceptionHandler("/Home/Error");app.UseHsts();}app.UseHttpsRedirection();app.UseStaticFiles();app.UseRouting();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");});
}
  • UseDeveloperExceptionPage:在開發環境中顯示詳細的錯誤信息。
  • UseExceptionHandler:在生產環境中處理未處理的異常。
  • UseHsts:啟用 HTTP 嚴格傳輸安全。
  • UseHttpsRedirection:將 HTTP 請求重定向到 HTTPS。
  • UseStaticFiles:提供對靜態文件的支持。
  • UseRouting:啟用路由功能。
  • UseAuthorization:啟用授權功能。
  • UseEndpoints:定義應用程序的終結點和路由模式。

依賴注入 (Dependency Injection)

ASP.NET Core 內置了依賴注入框架,用于管理對象的創建和生命周期。可以在 Startup.csConfigureServices 方法中注冊服務。

注冊服務:

public void ConfigureServices(IServiceCollection services)
{services.AddControllersWithViews();services.AddScoped<IMyService, MyService>();
}

使用服務:通過構造函數注入服務。

public class HomeController : Controller
{private readonly IMyService _myService;public HomeController(IMyService myService){_myService = myService;}public IActionResult Index(){var data = _myService.GetData();return View(data);}
}

配置 (Configuration)

ASP.NET Core 提供了靈活的配置系統,支持從多個源讀取配置,如文件、環境變量、命令行參數等。

appsettings.json:

{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"AllowedHosts": "*"
}

通過 IConfiguration 接口在應用程序中訪問配置:

public class MyService
{private readonly IConfiguration _configuration;public MyService(IConfiguration configuration){_configuration = configuration;}public void DoSomething(){var value = _configuration["MySetting:SubSetting"];// 使用配置值}
}

11. 路由 (Routing)

ASP.NET Core 路由系統將請求 URL 映射到特定的處理程序(如控制器和操作方法)。

Startup.csConfigure 方法中配置路由:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{app.UseRouting();app.UseEndpoints(endpoints =>{endpoints.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");});
}

通過屬性路由定義控制器和操作方法的路由:

[Route("api/[controller]")]
public class ProductsController : Controller
{[HttpGet]public IActionResult GetAll(){// 獲取所有產品}[HttpGet("{id}")]public IActionResult GetById(int id){// 根據 ID 獲取產品}
}

12. 安全性 (Security)

ASP.NET Core 提供了一套完整的安全機制,幫助開發者構建安全的 Web 應用程序。

身份驗證和授權

支持多種身份驗證方式,如 Cookie、JWT、OAuth 等。

配置身份驗證

Startup.cs 中配置身份驗證:

public void ConfigureServices(IServiceCollection services)
{services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(options =>{options.LoginPath = "/Account/Login";options.LogoutPath = "/Account/Logout";});services.AddAuthorization(options =>{options.AddPolicy("RequireAdministratorRole", policy =>policy.RequireRole("Administrator"));});services.AddControllersWithViews();
}

在請求管道中啟用身份驗證和授權中間件:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{app.UseAuthentication();app.UseAuthorization();// 其他中間件
}
數據保護

內置數據保護 API,幫助加密和解密敏感數據。

public class HomeController : Controller
{private readonly IDataProtector _protector;public HomeController(IDataProtectionProvider provider){_protector = provider.CreateProtector("MyPurposeString");}public IActionResult Protect(){var plaintext = "Hello World!";var protectedData = _protector.Protect(plaintext);var unprotectedData = _protector.Unprotect(protectedData);return Content($"Original: {plaintext}, Protected: {protectedData}, Unprotected: {unprotectedData}");}
}

13. 性能優化

ASP.NET Core 提供了多種性能優化技術,確保應用程序的高性能。

響應緩存

通過響應緩存中間件實現響應緩存。

public void ConfigureServices(IServiceCollection services)
{services.AddResponseCaching();
}public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{app.UseResponseCaching();// 其他中間件
}
內存緩存和分布式緩存

通過內存緩存和分布式緩存提高應用程序性能。

public void ConfigureServices(IServiceCollection services)
{services.AddMemoryCache();services.AddDistributedRedisCache(options =>{options.Configuration = "localhost:6379";options.InstanceName = "SampleInstance";});
}

使用緩存:

public class HomeController : Controller
{private readonly IMemoryCache _memoryCache;private readonly IDistributedCache _distributedCache;public HomeController(IMemoryCache memoryCache, IDistributedCache distributedCache){_memoryCache = memoryCache;_distributedCache = distributedCache;}public IActionResult CacheExample(){// 使用內存緩存_memoryCache.Set("key", "value");// 使用分布式緩存_distributedCache.SetString("key", "value");return View();}
}

ASP.NET 項目搭建

項目創建

  • 打開 Visual Studio。
  • 選擇“創建新項目”。
  • 在“創建新項目”對話框中,選擇“ASP.NET Core Web 應用程序”,然后點擊“下一步”。
  • 在“配置新項目”對話框中,輸入項目名稱和位置,然后點擊“創建”。

發布應用程序

  • 在 Visual Studio 中右鍵點擊項目,在上下文菜單中選擇“發布”。
  • 在“發布”窗口中,選擇“文件夾”作為發布目標,然后點擊“創建配置文件”。
  • 選擇一個文件夾路徑作為發布位置,然后點擊“發布”。
    在這里插入圖片描述
    在這里插入圖片描述

搭建 IIS 服務器

安裝 IIS 服務器

在控制面板的“Windows 功能”對話框中,勾選“Internet Information Service”及其所有子項。
在這里插入圖片描述
打開瀏覽器,輸入 http://localhost,你應該能看到默認的 IIS 歡迎頁面,表示 IIS 安裝成功。
在這里插入圖片描述

配置 IIS 站點

  • 創建新站點

    • 在 IIS 管理器中,右鍵點擊“網站”,選擇“添加網站”。
    • 輸入站點名稱(例如“MyAspNetCoreApp”)。
    • 設置物理路徑為發布文件夾的位置,例如 C:\publish\MyAspNetCoreApp
    • 設置端口為 80 或其他你想使用的端口,然后點擊“確定”。
      在這里插入圖片描述
  • 配置應用程序池

    • 在“IIS 管理器”的左側樹中,選擇“應用程序池”。
    • 找到你新創建的網站使用的應用程序池,右鍵點擊它,選擇“高級設置”。
    • 確保“啟用 32 位應用程序”設置為“False”。
    • 確保“.NET CLR 版本”設置為“無托管代碼”。
  • 設置站點的應用程序池

    • 在“IIS 管理器”中,展開“網站”,選擇你剛剛創建的網站。
    • 在右側“操作”面板中,點擊“基本設置”。
    • 確保“應用程序池”選擇的是你剛剛配置的應用程序池。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/16536.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/16536.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/16536.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于混合Transformer-CNN模型的多分辨率學習方法的解剖學標志檢測

文章目錄 Anatomical Landmark Detection Using a Multiresolution Learning Approach with a Hybrid Transformer-CNN Model摘要方法實驗結果 Anatomical Landmark Detection Using a Multiresolution Learning Approach with a Hybrid Transformer-CNN Model 摘要 精確定位…

跨域計算芯片,一把被忽視的汽車降本尖刀

作者 |王博 編輯 |德新 2019年前后&#xff0c;「中央運算單元區域控制」的架構被提出。基于這一趨勢&#xff0c;從板級的多芯片&#xff0c;到板級的單芯片&#xff0c;集成度越來越高&#xff0c;跨域計算芯片隨之來到聚光燈下。 跨域計算芯片的特點是&#xff0c;與專為智…

Django 里傳參給html文件

第一步&#xff1a;在 urls.py 文件里修改 from django.contrib import admin from django.urls import path from app01 import views # 添加這一行urlpatterns [#path(admin/, admin.site.urls),path(index/, views.index), # 添加這一行 ]第二步&#xff1a;在 settings…

若依框架的配置文件詳解:從數據庫配置到高級定制

若依框架&#xff08;RuoYi&#xff09;作為一個基于Spring Boot和MyBatis的快速開發平臺&#xff0c;提供了豐富的配置選項&#xff0c;讓開發者能夠靈活地調整和擴展其功能。配置文件在若依框架中扮演著至關重要的角色&#xff0c;通過合理配置&#xff0c;可以實現對數據庫連…

牛客網刷題 | BC97 回文對稱數

目前主要分為三個專欄&#xff0c;后續還會添加&#xff1a; 專欄如下&#xff1a; C語言刷題解析 C語言系列文章 我的成長經歷 感謝閱讀&#xff01; 初來乍到&#xff0c;如有錯誤請指出&#xff0c;感謝&#xff01; 描述 今天牛牛學到了回文…

鎖相環的一些學習筆記--(1)

下圖兩組1.2.3可以對應起來&#xff1b; 一些分析&#xff1a; 1.根據這個可知最后vco_voltage停在0.5v 參考資料&#xff1a; 1. Matlab https://www.bilibili.com/video/BV1bR4y1Z7Xg/?spm_id_from333.1296.top_right_bar_window_history.content.click&vd_source555…

Redis RDB 持久化問題

前言 Redis 是內存數據庫&#xff0c;它將自己的數據儲存在內存里面&#xff0c;如果不想辦法將儲存在內存中的數據保存到磁盤里面&#xff0c;那么一旦服務器進程退出&#xff0c;服務器中的數據也就沒了。 因此&#xff0c;Redis 提供了 RDB 持久化功能&#xff0c;這個功能…

如何將Windows PC變成Wi-Fi熱點?這里提供詳細步驟

序言 Windows 10和Windows 11都有內置功能,可以將你的筆記本電腦(或臺式機)變成無線熱點,允許其他設備連接到它并共享你的互聯網連接。以下是操作指南。 由于Windows中隱藏的虛擬Wi-Fi適配器功能,你甚至可以在連接到另一個Wi-Fi網絡或無線路由器時創建Wi-Fi熱點,通過另…

魯教版七年級數學上冊-筆記

文章目錄 第一章 三角形1 認識三角形2 圖形的全等3 探索三角形全等的條件4 三角形的尺規作圖5 利用三角形全等測距離 第二章 軸對稱1 軸對稱現象2 探索軸對稱的性質4 利用軸對稱進行設計 第三章 勾股定理1 探索勾股定理2 一定是直角三角形嗎3 勾股定理的應用舉例 第四章 實數1 …

實習生在Linux環境下如何日常使用?

那我簡單來說兩個我使用的場景吧 我在搭建我們的測試環境的時候&#xff0c;先上傳jar包到測試環境對應的目錄下&#xff0c;然后呢此時jar包是不可被執行的&#xff0c;所有就有了 chmod x jar包名稱, 接下來&#xff0c;我是用 jps 查看Java的進程&#xff0c;獲取到pid之后…

Kafka 安裝教程和基本操作

一、簡介 Kafka 是最初由 Linkedin 公司開發&#xff0c;是一個分布式、分區的、多副本的、多訂閱者&#xff0c;基于 zookeeper 協調的分布式日志系統&#xff08;也可以當做 MQ 系統&#xff09;&#xff0c;常見可以用于 web/nginx 日志、訪問日志&#xff0c;消息服務等等…

基于YOLO算法實現網球運動實時分析(附源碼)

大家好&#xff0c;我是小F&#xff5e; 今天給大家介紹一個計算機視覺實戰的項目。 該項目使用YOLO算法檢測球員和網球&#xff0c;并利用cnn提取球場關鍵點。 進而分析視頻中的網球運動員&#xff0c;測量他們的速度、擊球速度和擊球次數。 使用win10電腦&#xff0c;Python …

【源碼】java + uniapp交易所源代碼/帶搭建教程java交易所/完整源代碼

java uniapp交易所源代碼/帶搭建教程java交易所/完整源代碼 帶簡潔教程&#xff0c;未測 java uniapp交易所源代碼/帶搭建教程java交易所/完整源代碼 - 吾愛資源網

【古董技術】ms-dos應用程序的結構

序 制定一個MS-DOS應用程序計劃需要認真分析程序的大小。這種分析可以幫助程序員確定MS-DOS支持的兩種程序風格中哪一種最適合該應用程序。.EXE程序結構為大型程序提供了好處&#xff0c;因為所有.EXE文件之前都有額外的512字節&#xff08;或更多&#xff09;的文件頭。另一方…

C++第十七彈---string使用(下)

?個人主頁&#xff1a; 熬夜學編程的小林 &#x1f497;系列專欄&#xff1a; 【C語言詳解】 【數據結構詳解】【C詳解】 目錄 1、標準庫中的string類 1.1、string類的常用接口說明 1.1.1、string類對象的修改操作 1.1.2、string類對象非成員函數重載 總結 1、標準庫中的…

牛客熱題:有效括號

&#x1f4df;作者主頁&#xff1a;慢熱的陜西人 &#x1f334;專欄鏈接&#xff1a;力扣刷題日記 &#x1f4e3;歡迎各位大佬&#x1f44d;點贊&#x1f525;關注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目錄 牛客熱題&#xff1a;有效括號題目鏈接方法一&#x…

MySQL視圖教程(01):創建視圖

MySQL 創建視圖 在 MySQL 中&#xff0c; CREATE VIEW 語句用于創建一個數據庫視圖&#xff08;View&#xff09;。 MySQL 是一種常用的關系型數據庫管理系統&#xff0c;提供了 CREATE VIEW 語法&#xff0c;用于創建視圖&#xff08;View&#xff09;。視圖是一種虛擬的表&…

Mycat+Mysql搭建數據集群實現數據分片存儲

前言 MyCAT介紹 * 一個徹底開源的,面向企業應用開發的“大數據庫集群”; * 支持事務、ACID、可以替代MySQL的加強版數據庫; * 一個可以視為“MySQL”集群的企業級數據庫,用來替代昂貴的Oracle集群; * 一個融合內存緩存技術、Nosql技術、HDFS大數據的新型SQL; * 一個新穎…

QCC---DFU升級變更設備名和地址

QCC---DFU升級變更設備名和地址 這個很多人碰到這個疑問,升級了改不了設備名和地址 /******************************************************************************* Copyright (c) 2018 Qualcomm Technologies International, Ltd. FILE NAME sink_dfu_ps.c DESCRIPT…

2024.5.1學習記錄

1、代碼隨想錄&#xff1a;貪心刷題 2、react 高級使用( hoc render、props、函數組件、serState 傳送門等) 3、游山玩水