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
:控件的文本屬性。
上述示例代碼的工作原理為:
- 初次加載:當用戶首次訪問
Default.aspx
頁面時,頁面會執行Page_Load
事件處理程序,檢查IsPostBack
屬性。如果頁面是首次加載(!IsPostBack
),則設置lblMessage
控件的文本為"Welcome to my ASP.NET page!"
。 - 瀏覽器顯示:IIS 處理
Default.aspx
頁面,將其轉換為 HTML,并將生成的 HTML 發送到客戶端瀏覽器進行顯示。 - 回發處理:如果頁面是由于某些操作(例如按鈕點擊)回發的,
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"
:表示該控件在服務器端運行。
上述示例代碼的工作原理為:
- 定義用戶控件:在
MyControl.ascx
文件中定義用戶控件的布局和內容,并在MyControl.ascx.cs
文件中定義控件的邏輯。 - 插入用戶控件:在需要使用用戶控件的 ASPX 頁面中,通過
<%@ Register ... %>
指令注冊用戶控件,并通過自定義標簽將其插入到頁面中。 - 運行時行為:
- 當 ASPX 頁面加載時,用戶控件的
Page_Load
方法會被調用,設置標簽控件的文本。 - 整個頁面包括用戶控件的內容將被處理成 HTML 并發送到客戶端瀏覽器進行顯示。
- 當 ASPX 頁面加載時,用戶控件的
通過這種方式,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!”。
上述代碼的整體工作原理為:
- 定義 Web 服務:在
MyWebService.asmx
文件中通過<%@ WebService ... %>
指令指定使用MyApp.MyWebService
類來處理 Web 服務請求。 - 實現 Web 服務:在
MyWebService.asmx.cs
文件中定義具體的服務方法,使用[WebMethod]
屬性標識這些方法,使其可以通過 Web 服務調用。 - 運行時行為:
- 當客戶端請求
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
表示該處理程序實例不可重用。每次請求都會創建一個新的處理程序實例。
上述示例代碼的工作原理為:
- 配置處理程序:在
web.config
中配置處理程序,使 IIS 能識別并處理以.ashx
結尾的請求,并將這些請求指派給MyApp.MyHandler
類。 - 處理請求:當瀏覽器或客戶端請求
.ashx
文件時,IIS 會將該請求路由到MyHandler
類的ProcessRequest
方法。 - 生成響應:
ProcessRequest
方法被調用,設置響應的內容類型為text/plain
。- 向響應寫入
"Hello, this is an ASHX handler."
,這段文本將被發送回客戶端。
- 完成請求:處理程序處理完請求后,IIS 將響應發送回客戶端,客戶端瀏覽器顯示純文本內容。
這種機制適用于需要處理簡單請求且不需要完整頁面渲染的場景,如生成動態內容(例如生成圖像、提供數據接口)或處理后臺任務。通過這種方式,可以提高響應速度和處理效率。
.cs & .dll:代碼文件
.cs
:C# 代碼文件,通常包含公共類和業務邏輯。.dll
:動態鏈接庫文件,CS 文件編譯后的程序集,包含編譯后的代碼和資源。位于項目的bin
目錄。
WebConfig 配置
web.config
是 ASP.NET 應用程序中的重要配置文件,用于定義應用程序的各種配置設置,如數據庫連接字符串、安全性設置、自定義錯誤頁面等。每個 ASP.NET 應用程序的根目錄通常都有一個 web.config
文件,該文件使用 XML 格式編寫。以下是 web.config
文件的詳細介紹:
主要功能和用途
- 應用程序設置:用于存儲自定義應用程序配置值。
- 連接字符串:用于存儲數據庫連接字符串。
- 安全配置:定義身份驗證和授權設置。
- 錯誤處理:配置自定義錯誤頁面。
- 模塊和處理程序:定義和配置 HTTP 模塊和處理程序。
- 調試和編譯設置:配置調試和編譯選項。
- 緩存設置:配置輸出緩存和數據緩存。
- 國際化和本地化設置:配置區域和語言設置。
結構示例
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 處理程序。相比于 httpHandlers
,handlers
的 system.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.cs
的 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?}");});
}
- UseDeveloperExceptionPage:在開發環境中顯示詳細的錯誤信息。
- UseExceptionHandler:在生產環境中處理未處理的異常。
- UseHsts:啟用 HTTP 嚴格傳輸安全。
- UseHttpsRedirection:將 HTTP 請求重定向到 HTTPS。
- UseStaticFiles:提供對靜態文件的支持。
- UseRouting:啟用路由功能。
- UseAuthorization:啟用授權功能。
- UseEndpoints:定義應用程序的終結點和路由模式。
依賴注入 (Dependency Injection)
ASP.NET Core 內置了依賴注入框架,用于管理對象的創建和生命周期。可以在 Startup.cs
的 ConfigureServices
方法中注冊服務。
注冊服務:
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.cs
的 Configure
方法中配置路由:
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 管理器”中,展開“網站”,選擇你剛剛創建的網站。
- 在右側“操作”面板中,點擊“基本設置”。
- 確保“應用程序池”選擇的是你剛剛配置的應用程序池。