fbpx
维基百科

ASP.NET

ASP.NET是由微軟.NET Framework框架中所提供,開發Web應用程式的類別庫,封裝在System.Web.dll檔案中,顯露出System.Web命名空間,並提供ASP.NET網頁處理、擴充以及HTTP通道的應用程式與通訊處理等工作,以及Web Service的基礎架構。ASP.NET是ASP技術的後繼者,但它的發展性要比ASP技術要強大許多。

ASP.NET
開發者Microsoft
首次发布2002年1月5日,​21年前​(2002-01-05
当前版本
  • 3.3.0 (2023年10月24日;穩定版本)[1]
源代码库
  • github.com/aspnet/AspNetWebStack
编程语言.NET 程式語言,例如C#VB.NET
类型Web應用程式
许可协议Apache 2.0
网站www.asp.net
ASP.NET
扩展名
.aspx、.cshtml、.vbhtml
互联网媒体类型
text/html
开发者Microsoft

ASP.NET可以運行在安裝了.NET Framework的IIS伺服器上,若要在非微軟的平台上執行,則需要使用Mono平台[2],ASP.NET在2.0版本已經定型,在.NET Framework 3.5上則加上了許多功能,像是ASP.NET AJAXASP.NET MVC Framework、ASP.NET Dynamic Data與Microsoft Silverlight的伺服器控制項等。

很多人都把 ASP.NET 當做是一種程式語言,但它實際上只是一個由 .NET Framework 提供的一種開發平台 (development platform),並非程式語言。也可认为ASP.NET是.NET组件,任何.NET语言,例如C#,可以引用该组件,创建网页或Web服务。

為了因應雲端化所誘發的多作業平台整合與開發能力,微軟特別開發一個新一代的 ASP.NET,稱為 ASP.NET vNext,並於 2014 年命名為 ASP.NET 5,但隨後於 2016 年將它更名為 ASP.NET Core,由於架構上的差異頗大,因此未來 ASP.NET 與 ASP.NET Core 將是分別發展與維護,Windows 平台的 ASP.NET 4.6 以上版本仍維持 Windows Only,但 ASP.NET Core 則是具有跨平台 (Windows, Mac OSX 與 Linux) 的能力。

發展緣起 编辑

 
斯科特·格思里英语Scott Guthrie

ASP.NET的前身ASP技術,是在IIS 2.0上首次推出(Windows NT 3.51),當時與 ADO 1.0 一起推出,在IIS 3.0(Windows NT 4.0)發揚光大,成為伺服器端應用程式的熱門開發工具,微軟還特別為它量身打造了Visual InterDev開發工具,在1994年到2000年之間,ASP技術已經成為微軟推展Windows NT 4.0平台的關鍵技術之一,數以萬計的ASP網站也是這個時候開始如雨後春筍般的出現在網路上。由於它的簡單以及高度客制化的能力,也是它能迅速竄起的原因之一。

不過ASP的缺點也逐漸的浮現出來:

  • 義大利麵型的程式開發方法,讓維護的難度提高很多,尤其是大型的ASP應用程式。
  • 直譯式的VBScriptJScript語言,讓效能有些許的受限。
  • 延展性因為其基礎架構擴充性不足而受限,雖然有COM元件可用,但開發一些特殊功能(像檔案上傳)時,沒有來自內建的支援,需要尋求第三方軟體商開發的元件。

1997年時,微軟開始針對ASP的缺點(尤其是義大利麵型的程式開發方法)準備開始一個新專案來開發,當時ASP.NET的主要領導人斯科特·格思里英语Scott Guthrie剛從杜克大學畢業,他和IIS團隊的Mark Anders經理一起合作兩個月,開發出了下一代ASP技術的原型,這個原型在1997年的聖誕節時被發展出來,並給予一個名稱:XSP[3],這個原型產品使用的是Java語言。不過它馬上就被納入當時還在開發中的CLR平台,Scott Guthrie事後也認為將這個技術移植到當時的CLR平台,確實有很大的風險(huge risk),但當時的XSP團隊卻是以CLR開發應用的第一個團隊。

為了將XSP移植到CLR中,XSP團隊將XSP的核心程式全部以C#語言重新撰寫(在內部的專案代號是 "Project Cool",但是當時對公開場合是保密的),並且改名為ASP+,作為ASP技術的後繼者,並且也會提供一個簡單的移轉方法給ASP開發人員。ASP+首次的Beta版本以及應用在PDC 2000中亮相,由Bill Gates发表Keynote(即關鍵技術的概覽),由富士通公司展示使用COBOL語言撰寫ASP+應用程式,並且宣布它可以使用Visual Basic.NETC#PerlPython語言(後兩者由ActiveState公司開發的互通工具支援)來開發。

在2000年第二季時,微軟正式推動.NET策略,ASP+也順理成章的改名為ASP.NET,經過四年的開發,第一個版本的ASP.NET在2002年1月5日亮相(和.NET Framework 1.0),Scott Guthrie也成為ASP.NET的產品經理(到現在已經開發了數個微軟產品,像ASP.NET AJAXMicrosoft Silverlight)。

ASP.NET處理架構 编辑

ASP.NET 運行的架構分為幾個階段:

  • 在 IIS 與 Web 伺服器中的訊息流動階段。
  • 在 ASP.NET 網頁中的訊息分派。
  • 在 ASP.NET 網頁中的訊息處理。

Web伺服器的訊息流動階段 编辑

 
ASP.NET執行架構

當裝載(hosting) ASP.NET 的 Web 伺服器接收到 HTTP 请求時,HTTP 聆聽程式 (HTTP Listener,实际上是内核态的HTTP.SYS) 會將请求轉交給 URL 指定的網站應用程式池中的工作者进程 (Worker Process)[4],ASP.NET 的工作者进程接收到这个请求之后,装载专用于处理ASP.NET页面的一个ISAPI扩展“aspnet_isapi.dll”,并将HTTP请求传给它。若是 IIS 5.0 時則是 aspnet_wp.exe。

aspnet_isapi.dll负责加载ASP.NET应用程序的运行环境CLR(IIS 7集成模式下,CLR是预加载的),每个ASP.NET应用程序都运行于自己的应用程序域(AppDomain)中。每个应用程序域都对应着一个ApplicationManager类的实例(通过AppManagerAppDomainFactory创建),负责管理运行在域中的ASP.NET应用程序(启动和停止一个ASP.NET应用程序、创建对象等)。ApplicationManager还会创建一个HostingEnvironment对象,提供了ASP.NET应用程序的一些管理信息(如ASP.NET应用程序的标识、虚拟目录与对应的物理目录等)。

应用程序域创建完成之后,创建 System.Web.Hosting 命名空間中的基于ISAPIRuntime的一个对象,调用其ProcessRequest()方法。在此方法中,根据传入的HTTP请求信息屏蔽了版本差异化后封装实例化了一个HttpWorkerRequest的对象并初始化一个HttpRuntime对象。调用HttpRuntime的ProcessRequestInternal方法。ProcessRequestInternal方法实例化一个HttpContext对象(其构造函数内部又实例化了在ASP.NET编程中非常重要的HttpRequest和HttpResponse对象)、通过HttpApplicationFactory获取HttpApplication对象实例。再调用HttpApplication对象的BeginProcessRequest方法启动整个HTTP请求的处理过程(即HTTP管线模式)。

System.Web.UI.Page类提供了“Requset”和“Response”属性来引用这两个对象,因此在ASP.NET网页中可以直接访问这两个对象。同样,System.Web.UI.Page类的Context属性引用HttpContext对象。

HttpRuntime类的ProcessRequest()方法除了创建HttpContext对象之外,还完成了另一个很重要的工作——向HttpApplicationFactory类的一个实例(它管理一个HttpApplication对象池)申请分配一个HttpApplication对象用于管理整个“HTTP请求处理管线(HTTP Pipeline)”中的各种事件的激发。在HttpApplication对象的InitModules()方法中创建HTTP模块(HTTP Module),通常在HTTP模块对象(实现IHttpModule接口)的Init()方法中响应HttpApplication对象所激发的特定事件。开发者可以创建基于IHttpHandler接口的对象,在Web.Config中插入特定的内容可以将自定义的HTTP模块加入到HTTP请求的处理流程中。 在IIS6和IIS7经典模式下,是用 Event+事件名称做key将所有事件的保存在HttpApplication的Events属性对象里,然后在BuildSteps里统一按照顺序组装。在IIS7集成模式下,是通过HttpModule名称+RequestNotification枚举值作为key将所有的事件保存在HttpApplication的ModuleContainers属性对象里,这个属性的类型是PipelineModuleStepContainer[]。

“HTTP请求处理管线(HTTP Pipeline)”的处理过程为:

  1. 预处理阶段:由多个HTTP模块参与,通过事件来驱动,主要是对HttpContext对象的各种属性进行修改。
  2. 处理阶段:由System.Web.UI.Page类接手HttpContext对象。Page类实现了IHttpHandler接口,因此有ProcessRequest()方法并被自动调用。ProcessRequest()方法的执行结果刷新了HttpContext对象的内容。
  3. 后处理阶段:HttpApplication对象继续激发后继的事件。如果有特定的HTTP模块响应这些事件,则它们会被自动调用。在管线末端,信息傳回到 ISAPIRuntime,以及 aspnet_isapi.dll,最後交由 HTTP Listener 回傳給用戶端。当HTTP请求处理完毕,相关的对象被释放,但创建的应用程序域,以及HttpApplication等对象仍然存活,以响应下一次HTTP请求。

具体的处理管线:

  1. BeginRequest: 开始处理请求。当ASP.NET运行时接收到新的HTTP请求的时候引发这个事件
  2. AuthenticateRequest授权验证请求,获取用户授权信息。当ASP.NET 运行时准备验证用户身份的时候引发这个事件
  3. PostAuthenticateRequest:验证身份成功。通过HttpContext.User获取
  4. AunthorizeRequest 用户权限授权。当ASP.NET运行时准备授权用户访问资源的时候引发这个事件
  5. PostAuthorizeRequest:获得授权
  6. ResolveRequestCache:获取页面缓存结果,如果存在直接返回结果
  7. PostResolveRequestCache 缓存检查结束
  8. MapRequestHandler:IIS7集成模式才支持
  9. 查找并创建HttpHandler:根据URL路径或扩展名和匹配规则查找创建,赋值给HttpContext.Handler属性(仅限于IIS6与IIS7经典模式)
  10. PostMapRequestHandler 成功创建IHttpHanlder对象
  11. AcquireRequestState 获取请求状态,一般用于获取Session:先判断当前页面对象是否实现了IRequiresSessionState接口,如果实现了,则从浏览器发来的请求报文体中获得SessionID,并到服务器的Session池中获得对应的Session对象,最后赋值给HttpContext的Session属性
  12. PostAcquireRequestState 成功获得Session
  13. PreRequestHandlerExecute:准备执行HttpHandler处理程序。
  14. 执行HttpHandler处理程序(仅限于IIS6与IIS7经典模式):调用HttpHandler的ProcessRequest方法(同步)或BeginProcessRequest方法(异步)。
  15. PostRequestHandlerExecute 执行HttpHandler处理程序结束。
  16. ReleaseRequestState 准备释放请求状态(Session)
  17. PostReleaseRequestState 成功释放请求状态(Session)
  18. Filter:将内容写入Filter(仅限于IIS6与IIS7经典模式)
  19. UpdateRequestCache 更新缓存
  20. Filter:将内容写入Filter(仅限于IIS7集成模式)
  21. PostUpdateRequestCache 已更新缓存
  22. LogRequest 为当前请求执行日志记录(仅限于IIS7集成模式)
  23. PostLogRequest 已完成日志(仅限于IIS7集成模式)
  24. EndRequest 完成。把响应内容发送到客户端之前引发这个事件。
  25. Noop:扩展使用(仅限于IIS6与IIS7经典模式)
  26. PreSendRequestHeaders:根据发送的Headers动态设置一些参数(仅限于IIS7集成模式)
  27. PreSendRequestContent:可对输出内容做压缩(仅限于IIS7集成模式)

在 ASP.NET 內部的 HTTP 處理器有:

  • ISAPIRuntime:由 aspnet_isapi.dll 呼叫,初始化 HttpWorkerRequest 物件(會由IIS的版本決定要初始化的版本)。
  • HttpRuntime:提供请求佇列 (Request Queue)、呼叫 HttpWorkerRequest 中的 ProcessRequest() 方法,以及後續的處理工作。
  • HttpWorkerRequest:產生 HttpApplication、HttpRequest、HttpResponse 等基礎物件的 HTTP 请求物件,並將要求轉送到要處理的物件(並呼叫它的 ProcessRequest() 方法)。
  • IHttpHandler 與 IHttpAsyncHandler:負責處理 HTTP 请求的單元,由 ProcessRequest() 來分派與執行请求。

ASP.NET網頁中的事件程序 编辑

當 HttpWorkerRequest 呼叫 ASP.NET 網頁(System.Web.UI 命名空間的 Page 類別)的 Page.ProcessRequest() 方法時,它會依序的引發 Page 內的各個事件,並同時呼叫在 Page 中所有控制項的相關事件,其引發順序為[5]

启动阶段:设置页面基本属性,如 Request 和 Response。在此阶段,页面还将确定请求是回发请求还是新请求,并设置 IsPostBack 属性。

  1. PreInit 事件:執行預先初始化的工作,在ASP.NET 2.0中,若要動態調整主版頁面 (Master Page)、佈景主題 (Theme) 時,要在這個事件中調整。设置页面一些最基本的特性,如加载个性化信息和主题、运行时Culture。
  2. Init 事件:執行初始化工作。根据页面的服务器标签及其属性设置,生成各个服务器控件的实例和给这些服务器控件的实例的属性进行赋值,并存入ViewState,但因为本阶段的赋值行为优先于ViewState的TrackViewState被调用,所以这些视图的值都将不会存入最终呈现的视图状态隐藏字段中。
  3. InitCompleted 事件:在完成初始化工作後引發。调用ViewState的TrackViewState方法,开启对视图状态更改的跟踪。
  4. Preload 事件:載入表单传值)。页面方法调用LoadViewState、LoadControlState、ProcessPostData,服务器控件对应调用LoadViewState和实现IPostBackDataHandler接口的LoadPostData方法
  5. Load 事件:執行載入的工作,大多數的網頁都擁有 Page_Load 事件處理常式,使用者控制項 (user control) 中也有 Page_Load 事件常式,都會在此時呼叫。
    控制項的 PostBack 變更通知:當網頁偵測到是 PostBack 要求時,會引發 PostBack 訊息通知的事件。
    控制項的 PostBack 相關事件:當網頁偵測到是 PostBack 要求時,會引發 PostBack 訊息指定的控制項的事件。
  6. LoadCompleted 事件:執行載入完成後的工作。
  7. PreRender 事件:處理在產生 HTML 結果前的工作。
  8. SaveStateCompleted 事件:處理頁面狀態(ViewState 與 ControlState)儲存完成後的事件。
  9. Render 事件:處理產生 HTML 的工作。
  10. Unload 事件:處理結束網頁處理時的工作。

如果 HttpWorkerRequest 呼叫的是實作 IHttpHandler 介面的 HTTP 處理常式 時,它只會呼叫 IHttpHandler.ProcessRequest() 方法,由它來處理程式的輸出,不像 Page.ProcessRequest() 會處理事件順序,因此 HTTP Handler 很適合輕量級的資料處理,像是輸出檔案資料流或是圖片資料流等。

ASP.NET的事件模型 编辑

ASP.NET 的原始設計構想,就是要讓開發人員能夠像 VB 開發工具那樣,可以使用事件驅動式程式開發模式 (Event-Driven Programming Model) 的方法來開發網頁與應用程式,若要以ASP技術來做到這件事的話,就必須要使用大量的輔助資訊,像是查詢字串或是表單欄位資料來識別與判斷物件的來源、事件流向以及呼叫的函式等等,需要撰寫的程式碼量相當的多,但 ASP.NET 很巧妙利用表單欄位和JavaScript指令碼把事件的傳遞模型隱藏起來了。

ASP.NET 的事件模型是由 <form runat="server"></form> 以及數個 Hidden Field 組合而成,基於 HTTP 模型的限制,所有的網頁程式在執行結果輸出到用戶端後,程式就會結束執行,為了維護在 ASP.NET 網頁與控制項的狀態資料,因此在輸出 ASP.NET 控制項時,ASP.NET 會將部份狀態資料儲存到網頁的 Hidden Field 中,這類型的狀態資料稱為 ViewState(ID 為 __VIEWSTATE),在伺服器端即會被解譯出狀態與事件資料。在大多數的內建 Web 控制項中都有使用到這個機制,因此在使用大量 ASP.NET Web 控制項的網頁中,會有許多的 ViewState 會存放在網頁中並隨著 HTTP 資料流輸出到用戶端,ViewState 在輸出時,會被加密為一組亂碼字串,其金鑰值定義在電腦中,並且每一個物件都會被序列化 (serialize) 成字串(因此若是自訂物件要放到 ViewState 時,則應要讓它支援序列化),再輸出到 __VIEWSTATE 欄位中,在每次的網頁來回時都會被傳輸,較大的 ViewState 會讓網頁大小膨脹,不利於快速的網路傳輸,不過 ASP.NET 本身有提供將 ViewState 關閉的功能,因此如果控制項不需要狀態保存時,可將它關閉以減少輸出的大小。

為確保控制項的事件能夠確實被引發,讓事件驅動能夠被執行,因此控制項事件引發命令時需要的參數,是交由 JavaScript 指令碼在用戶端引發時,填入另一個 Hidden Field(ID 為 __EVENTTARGET 以及 __EVENTARGUMENT),並且引發表單的送出指示 (submit),傳送到伺服端後,伺服端的 HttpApplication 中的工具函式會解析 __EVENTTARGET__EVENTARGUMENT 欄位中的資訊,並且交由控制項所實作的 RaisePostBackEvent() 來引發事件,並由 .NET Framework 內部的事件處理機制接手處理(呼叫控制項設定的事件處理常式)。

ASP.NET的來回模式 编辑

 

在 ASP.NET 運行的時候,經常會有網頁的來回動作 (round-trip),在 ASP.NET 中稱為 PostBack,在傳統的 ASP 技術上,判斷網頁的來回是需要由開發人員自行撰寫,到了 ASP.NET 時,開發人員可以用 Page.IsPostBack 機能來判斷是否為第一次執行(當 ASP.NET 發現 HTTP POST 要求的資料是空值時),它可以保證 ASP.NET 的控制項事件只會執行一次,但是它有個缺點(基於 HTTP POST 本身的缺陷),就是若使用者使用瀏覽器的重新整理功能(按 F5 或重新整理的按鈕)刷新網頁時,最後一次執行的事件會再被執行一次,若要避免這個狀況,必須要強迫瀏覽器清空快取才可以。

ASP.NET 2.0 中有新增三個來回模式:

  • Cross Page Postback:允許跨不同的網頁執行 PostBack,伺服端可使用 Page.IsCrossPostBack 來判斷是否是跨網頁型的來回。
  • Async Page Mode:允許網頁使用非同步的方式執行,伺服端可用 Page.IsAsync 來判斷。
  • Callback:ASP.NET 2.0 新增的由網頁回呼用戶端指令的功能,伺服端可用 Page.IsCallback 來判斷是否要求是來自 Callback。

來回模式不僅是 ASP.NET 運作時的核心,它也是 ASP.NET 應用程式的一個主要缺點,尤其是在設計複雜度高的頁面時,在網頁中隱藏的 ViewState 的大小會相當大,而在每次的來回動作中,都會傳送 ViewState 在內的表單資訊,大量的 ViewState 會使得傳送的時間拉長,而且每次來回動作都會讓整個網頁被刷新,而出現閃爍的情況(就算在本地端也一樣),但在AJAX技術尚未成熟時,只能夠忍受這種因底層限制所帶來的問題,在ASP.NET AJAX技術發展出來後,透過UpdatePanel成功的緩解了這個問題(但 ViewState 傳送的問題仍然未根本的解決,必須要使用像 Page Method 這樣的方式才能徹底的解決)。

繪製技術 编辑

熟悉 ASP 技術的人都知道,程式碼都是混在 HTML 標籤之間,以輸出預期需要的 HTML 指令,這個技術在 ASP.NET 中,由各控制項的繪製 (Render) 機制包裝起來了,繪製機制裝載了 HtmlTextWriter 物件,由它來產生 HTML 指令,它會輸出至 HttpContext 的 Response 輸出資料流中(即 ASP 技術的 Response.Write()),下列程式碼為繪製技術的示例:

[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]  protected override void Render(HtmlTextWriter output)  {  if ( (HasControls()) && (Controls[0] is LiteralControl) )   {  output.Write("<H2>Your Message: " + ((LiteralControl) Controls[0]).Text + "</H2>");  } } 

為了讓控制項的輸出有階層性,ASP.NET 開發了一個可以階層化輸出控制項 HTML 指令的方式,稱為控制項樹 (Control Tree),藉由控制項樹,可以讓各個控制項的輸出可以階層化,不論是否是收納型控制項,還是一般型的控制項,都可以按照控制項的順序來輸出。

狀態管理 编辑

狀態管理 (state management) 在Web應用程式中,一向是很重要的課題,良好的狀態管理可以幫助開發人員發展出具有狀態持續能力的應用程式(像是工作流程型應用程式或是電子商務應用程式),但狀態管理功能會視應用程式的部署狀態以及資訊的共用程度來選擇,在 ASP.NET 中,分為伺服器端狀態管理以及用戶端狀態管理,用戶端狀態管理為ViewState以及Cookies,伺服端狀態管理則是SessionApplication物件。它們的差異點在於:

  • ViewState 是加密的資料流,和 HTML 一起輸出到用戶端。
  • Cookies 是加密(也可不加密)的小型資料,和 HTML 不同,它可以快取在用戶端瀏覽器中。
  • Session 是伺服器端的狀態保存機制,每個用戶端均有獨立的空間(以瀏覽器執行個體來賦與唯一的SessionID值)。
  • Application 是伺服器端的狀態保存機制,但應用程式所有的用戶端共用同一份狀態資料。

應用程式層級物件 编辑

Application 物件會在應用程式的 Application_OnStart 事件中初始化,並使用名稱來識別資料(它是一個 NameObjectCollectionBase 集合的實作品),它會儲存在應用程式的範圍內,所有的連線(使用者)都可以使用,屬於共用型的儲存體,適合儲存所有使用者都可使用的資料,在多人使用的情況下,可以適當的使用 Lock/Unlock 的機制來確保應用程式狀態的更新。

Application.Lock(); Application["PageRequestCount"] =   ((int)Application["PageRequestCount"])+1; Application.UnLock(); 

連線層級物件 编辑

連線層級的物件是 Session,以瀏覽器的執行個體為識別單位,資料依瀏覽器的執行個體來儲存,在瀏覽器的執行個體第一次連到應用程式時,ASP.NET會設定一個Session ID,並且使用它來識別 Session,每一個 Session 都是 ICollection 與 IEnumerate 的實作,用 key 來識別資料值,並且具有時間的限制 (timeout),若超出時限時伺服器會自動清理掉,預設的 Session 時限為 20 分鐘。Session ID 的演算法是由 RNGCryptoServiceProvider(密碼編譯亂數產生器提供者)產生,並編碼成一個 Session ID 字串(例如 anf4vuup3xiq0arjlqla2l55 這樣的字串)儲存在伺服器中,用以識別不同的 Session 個體。

為因應不同的用戶端,ASP.NET 設計了不同的 Session ID 存放機制,像是舊式的瀏覽器或是行動用戶端這種不支援本地儲存cookie的裝置時,ASP.NET 可以直接在 URL 中加上 Session ID 的識別,像是 http://www.example.org/(anf4vuup3xiq0arjlqla2l55)/profile.aspx 這樣的 URL,可以由開發人員自行設定,或是使用 AutoDetect 設定來讓 ASP.NET 自行判斷要使用的 Session ID 存放方式。

Session ID 的產生方法可以由程式開發人員自訂,藉由覆寫 SessionIDManager 的 CreateSessionID() 方法來自訂。

using System; using System.Configuration; using System.Web.Configuration; using System.Web; using System.Web.SessionState; namespace Samples.AspNet.Session {  public class GuidSessionIDManager : SessionIDManager  {  public override string CreateSessionID(HttpContext context)  {  return Guid.NewGuid().ToString();  }  public override bool Validate(string id)  {  try  {  Guid testGuid = new Guid(id);  if (id == testGuid.ToString())  return true;  }  catch  {  }  return false;  }  } } 

跨機器狀態管理 编辑

狀態管理在單一伺服器上,可以儲存在伺服器的記憶體中,但若是在大型網站中,使用許多的 Web 伺服器來實行負載平衡(Load Balancing)處理時,會有狀態儲存在哪個位置的問題,因此需要有一個可以在每個 Web 伺服器之間做狀態儲存的媒介,像是獨立的伺服器或是資料庫等等。在 ASP.NET 中支援了四種狀態儲存的媒介[6]

  • InProc:儲存與 ASP.NET 相同的執行行程中 (in-procedure state),適合單一伺服器的狀態儲存。
  • StateServer:儲存在 ASP.NET 狀態伺服器 (state server) 中,適合跨伺服器的狀態儲存,但因為它使用的通訊埠,因此在使用上需要注意防火牆的問題。
  • SQLServer:儲存在獨立的 SQL Server 資料庫中,適合跨伺服器的狀態儲存。
  • Custom:以自行實作的狀態提供者 (state provider)。

部件 编辑

ASP.NET 是開發 Web 應用程式的基礎架構 (framework),除了它內部的運作方法外,對外也顯露了許多的開發支援,讓開發人員可以利用它來發展出許多強大的 Web 應用程式解決方案。

基礎部件 编辑

網頁 编辑

ASP.NET 最基礎的底層為網頁 (Page),網頁由 System.Web.UI.Page 類別來提供基礎支援,包含了頁面的事件以及物件繪製的引發點(Page 類別本身是一個 HTTP Handler 的實作品)。ASP.NET 網頁在微軟的官方名稱中,稱為 Web Form,除了是要和Windows Forms作分別以外,同時也明白的刻劃出了它的主要功能:「讓開發人員能夠像開發 Windows Forms 一樣的方法來發展 Web 網頁」。因此 ASP.NET Page 所要提供的功能就需要類似 Windows Forms 的表單,每個 Web Form 都要有一個 <form runat="server"></form> 區塊,所有的 ASP.NET 伺服器控制項都要放在這個區域中,這樣才可以讓 ViewState 等伺服器控制能夠順暢的運作。

在網頁中也可以使用程式碼,以類似於ASP時代的撰寫方式來開發,此種開發方式稱為 inline code,在 ASP.NET 的程式開發模式中,inline code ,要放在 <script runat="server"></script> 區域中,如下列的範例程式:

<%@ Page Language="C#" %>   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">   <script runat="server">    protected void Page_Load(object sender, EventArgs e)  {  Label1.Text = DateTime.Now.ToLongDateString();  }   </script>   <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server">  <title>Sample page</title> </head> <body>  <form id="form1" runat="server">  <div>  The current time is: <asp:Label runat="server" id="Label1" />  </div>  </form>   </body> </html> 

另一種模式則是將程式碼和網頁分離,這種模式稱為程式碼後置 (Code-Behind),這個方法可以將程式碼獨立到一個檔案中,網頁可以保持較乾淨的狀態,讓維護網頁程式的複雜度降低很多,在網頁的提示指令 (directive) 中,可以設定程式碼後置的參數,像是 Inherit、CodeFile、Class 等參數。

<%@ Page Language="C#" CodeFile="SampleCodeBehind.aspx.cs" Inherits="Website.SampleCodeBehind" AutoEventWireup="true" %>

而一個典型的程式碼後置例子為:

using System;   namespace Website {  public partial class SampleCodeBehind : System.Web.UI.Page  {  protected override void Page_Load(EventArgs e)  {  base.OnLoad(e);  }  } } 

使用程式碼後置模式的設定時,可以讓 ASP.NET 執行引擎在載入網頁時,由程式碼後置參數取得對應的類別資訊,藉以使用 Reflection 的方式來執行後置的程式碼。

ASP.NET 可以支援HTMLXHTML兩種網頁內容,但在Visual Studio.NET中,預設是使用 HTML,但在Visual Studio 2005以後的版本,則一律都改用XHTML格式。

控制項 编辑

ASP.NET 的內建控制項分為兩種:

  • HTML 控制項 (HTML control):直接在 HTML 標記中加上 runat="server",即可對應到 ASP.NET 指定的 HTML 伺服器控制項類別,像是:
    • HtmlAnchor:表示 HTML 的 <a>。
    • HtmlButton:表示 HTML 的 <input type="button">。
    • HtmlImage:表示 HTML 的 <img>。
    • HtmlGenericControl:表示沒有對應到伺服器控制項的物件,都會被對應到這個類別。
  • Web 控制項 (Web control):由 ASP.NET 提供,比 HTML 控制項提供更多的功能,但操作與設定會比 HTML 控制項要複雜許多,像是:
    • LinkButton:一種外型為連結 (<a>) 的按鈕。
    • CheckBoxList:建立 CheckBox 的清單的控制項。
    • GridView:將資料繫結並產生 HTML 表格的控制項。
    • RequiredFieldValidator:檢查欄位是否有輸入資料的控制項。

除了內建的控制項之外,ASP.NET 也提供了可以自訂的控制項架構,並且支援兩種控制項開發方法:

  • 使用者控制項 (User control),以 .ascx 為副檔名,可以讓開發人員用最輕鬆的方式來開發控制項,優點是開發速度很快,但缺點是無法轉散布,且無法加入參考。
  • 自訂控制項 (Custom control),可轉散布型的控制項,是經過編譯後的程式碼 (DLL),可單獨轉散布,並且可在其他的專案加入參考取用,自訂控制項有三種開發模式:
    • 基礎控制項 (General Control):由 System.Web.UI.Control 類別繼承而來,或是由現有的 Web 控制項繼承而來,像是由 Button 控制項繼承。
    • 複合控制項 (Composite Control):由 System.Web.UI.WebControls.CompositeControl 繼承而來,可以用複合的方式來開發控制項。
    • 樣板控制項 (Template Control):可以在控制項中使用樣板 (template),並套用資料到樣板中,支援資料繫結的運算式。

指令碼 编辑

ASP.NET 的 Web 控制項有時會包裝一些用戶端指令碼 (client-side scripting),在控制項被繪製時輸出到用戶端,這些指令碼多數被包裝在 DLL 的資源檔中,並由 ScriptResource.axd 處理常式來輸出,開發人員也可以利用 ClientScriptManager(Page.ClientScript 屬性)中的方法來添加指令碼到網頁程式中,常用的方法有:

  • ClientScriptManager.RegisterClientScriptBlock():註冊用戶端指令碼區塊 (script block)。
  • ClientScriptManager.RegisterStartupScript():註冊在起始時執行的指令碼。
  • ClientScriptManager.RegisterOnSubmitStatement():註冊在處理表單發送時要執行的指令碼。
  • ClientScriptManager.RegisterClientScriptInclude():註冊由外部檔案 (.js) 提供的指令碼來源。

基本物件 编辑

以往在 ASP 中常被使用的五大基本物件,在 ASP.NET 中仍然持續被支援,但它們都換了一個身份來提供:

  • Application:包裝了 HttpApplication 物件,在程式中使用 Application 指令取得的物件,都是來自於 HttpContext.Current.Application 屬性回傳而得。
  • Request:包裝了 HttpRequest 物件,在程式中使用 Request 指令取得的物件,都是來自於 HttpContext.Current.Request 屬性回傳而得。
  • Response:包裝了 HttpResponse 物件,在程式中使用 Response 指令取得的物件,都是來自於 HttpContext.Current.Response 屬性回傳而得。
  • Session:包裝了 HttpSessionState 物件,在程式中使用 Session 指令取得的物件,都是來自於 HttpContext.Current.Session 屬性回傳而得。
  • Server:包裝了 HttpServerUtility 物件,在程式中使用 Server 指令取得的物件,都是來自於 HttpContext.Current.Server 屬性回傳而得。

導覽部件 编辑

導覽部件 (navigation controls)[7] 是在 ASP.NET 2.0 中才出現的功能,包含:

  • 選單 (Menu):提供內建的滑鼠偵測方式,實作階層式的選單功能。
  • 網站地圖 (Sitemap):提供可層次化目前瀏覽位置的功能,可支援由 Web.sitemap 中的資料,或是來自資料庫或 XML 資料檔中的資料來源。
  • 樹狀檢視 (TreeView):提供階層化的資料瀏覽,類似於檔案總管的介面。

應用程式服務 编辑

應用程式服務 (application services) 是在 ASP.NET 2.0 中才開始提供,它以 Provider-based Pattern 為主,實作出數個網站的常用服務,包含會員服務 (Membership Service)[8]、角色服務 (role service)[9]與設定檔服務 (profile service)[10] 等。

會員服務由 Membership 以及其資料提供者 MembershipProvider 構成,應用程式使用 Membership 所顯露的方法來操作,它會將要求轉送給指定的 MembershipProvider 實作來處理,ASP.NET 目前支援來自於資料庫的 SqlMembershipProvider(支援 SQL Server)以及來自於Active Directory的 ActiveDirectoryMembershipProvider,開發人員也可以自行由 MembershipProvider 繼承來實作自訂的會員服務資料提供者。

角色服務與會員服務類似,由 Role 以及其資料提供者 RoleProvider 構成,應用程式使用 Role 所顯露的方法操作,由 RoleProvider 實作提供資料服務,目前內建的 RoleProvider 有來自 Active Directory 或 XML 檔案的 AuthorizationStoreRoleProvider,由 SQL Server 供應資料的 SqlRoleProvider,以及支援 Windows 角色的 WindowsTokenRoleProvider 三種,開發人員可自行實作 RoleProvider 的方法以發展出自訂的角色服務提供者。

設定檔服務是一個特殊的服務,它結合了 .NET Framework 的 CodeDOM 開發模式,以及 System.Web.Profile 命名空間的 ProfileBase、ProfileInfo 與 ProfileManager 等類別,組合出完整的設定檔支援,其資料來源也是以 Provider-based Pattern 為主,由 ProfileProvider 提供,ASP.NET 內建由 SQL Server 資料庫建立的 SqlProfileProvider,其欄位係由開發人員在 ASP.NET 組態檔中自行定義,再由 ASP.NET 動態產生強型別的欄位屬性。

設定檔服務也是作為 ASP.NET 2.0 的網頁組件 (Web Part Framework) 所需要的設定檔儲存支援[11],Web Part Framework 可以讓開發人員可以開發出具備個人化能力 (Personalization) 的網頁配置方案,讓使用者可以用自行新增與拖放的方式來設計自己的網頁佈置,所需要的設定儲存即由設定檔服務處理。

另一個需要和應用程式服務配合使用的功能為 Web 事件架構 (Web Event Framework)[12],它需要由應用程式服務提供資料結構,它也有 Provider-based Pattern,並可以支援數種的事件資料提供者。

延展性支援 编辑

除了 ASP.NET 網頁以外,.NET Framework 還提供了兩種可以由開發人員自行發展處理模型的模組,一種是HTTP Handler,另一種則是HTTP Module[13]

HTTP Handler(副檔名為 .ashx)由 System.Web.IHttpHandler 介面定義了必要的方法(可支援非同步的 HTTP Handler 稱為 HTTP Async Handler,由 System.Web.IHttpAsyncHandler 介面定義),其中最重要的方法是 ProcessRequest() 方法,開發人員必須要實作這個方法,才能夠讓 HTTP Handler 有作用,它也可以透過 ASP.NET 的組態設定,讓 HTTP Handler 可以處理特定的副檔名,它可以被視為 .NET Framework 中的 ISAPI Extensions 實作方法。

HTTP Module 則是由 System.Web.IHttpModule 介面定義,它可以在整個網頁生命週期中被呼叫多次,並實際處理由 HttpApplication 所引發的事件,開發人員需要實作 IHttpModule.Init() 方法,以及處理 HttpApplication 事件需要的程式碼。它可被視為 .NET Framework 中的 ISAPI Filter 實作方法。

一致性與多樣性介面的支援  编辑

ASP.NET 在一開始的時候是缺乏範本引擎 (template engine) 的,其主因是.NET Framework本身是物件導向,且需要用繼承的方式才能夠延伸功能,大多數的開發人員都是由 System.Web.UI.Page 繼承並定義出新的基礎類別,並撰寫要繪製 HTML 的方法,以及在他們的應用程式中修改以繼承該類別,然而這個方法可能會被用在網站的很多地方,因而會大大的提升混合程式碼與標記的複雜度,這個方法也只能在執行期才能夠以視覺化的方式測試,無法在設計時期視覺化,其他的開發人員總是使用原有的 ASP 方法(即<!-- #include --> 指令)來把每個網頁需要的部份包到網頁中,防止在每個網頁中都要撰寫相同的導覽程式碼。

在 ASP.NET 2.0 中,推出了母板頁面 (master page)的概念[14],它可以讓開發人員先行定義外觀版型 (*.master),再使用它來套用實際執行的網頁,網頁與主版頁面之間以 ContentPlaceHolder 的 ID 做連結,以套用正確的內容到保留區(即由 ContentPlaceHolder 包住的區域)中,開發人員也可以定義在保留區沒有套用時需要顯示的預設內容。在 ASP.NET 3.5 中更進一步的支援設計時期的巢狀主版頁面 (nested master pages),以及把網頁的 HEAD 區塊納入 ContentPlaceHolder 的範圍。

與主版頁面相關的,還有主題(Theme)以及面板(skin)技術[15],這兩個技術允許開發人員或設計人員自行定義網頁的樣式設定以及套用的樣式支援,每個主題中可以包含數個面板檔,這些面板檔決定了控制項要輸出時套用的樣式,開發人員則可以利用主題來決定不同的外觀要使用的樣式。

ASP.NET 也允許在應用程式中動態的變更主版頁面與主題,但必須要在頁面的 PreInit 事件常式設定。

void Page_PreInit(Object sender, EventArgs e) {  Page.MasterPageFile = "~/NewMaster.master";  Page.Theme = "MyTheme"; } 

編譯模型 编辑

ASP.NET 在 1.x 時,使用的是組件為主的編譯方式,一個網頁只會產生一個組件,這個方式最大的優點,就是可以自由定義命名空間,且在部署應用程式時會比較方便,但由於 ASP.NET 1.x 所處的時代,如果網站是有許多程式碼的情況下(即 DLL 檔很大),載入的速度會變慢,且佔用記憶體的量會很多,當時的記憶體價格也尚未降到現在的水準。因此在 ASP.NET 2.0 開始,另外提供了一個預先編譯(Pre-compilation) 的編譯模型,這個編譯方法會將每個網頁都各自編譯成一個組件,其檔案名稱會是 App_[亂數字串].dll 命名,在編譯時期由 ASP.NET Pre-compilation 工具(aspnet_compiler.exe)給定,優點是可以不必載入過量的程式碼到記憶體中,但缺點則是無法自訂命名空間,而且在更新時必須要更新所有的 DLL 檔以及網頁等,否則會造成名稱不一致,讓 DLL 無法被載入的問題。

早期 ASP.NET 2.0 僅提供預先編譯模式,讓它的缺點很快的被暴露出來,因此微軟也為 ASP.NET 2.0 開發了沿用 ASP.NET 1.x 的編譯模型的工具:Web Application Project,在 Visual Studio 2008 中開始內建,至此,ASP.NET 支援兩種編譯模式的架構抵定。

安全性支援 编辑

ASP.NET 的安全性支援分為驗證 (Authentication)授權 (Authorization)兩個部份。

驗證 编辑

ASP.NET 的驗證方式有三種[16]

  • Windows 驗證:由 IIS 目前執行的帳戶,或者是使用者模擬 (user impersonate) 帳戶的方式進行驗證。
  • 表單驗證:由表單的資料提供驗證,開發人員自訂驗證邏輯,並交由 ASP.NET 表單驗證工具寫入驗證憑證,以進行授權。
  • Passport 驗證:在 ASP.NET 1.x 中,連接Windows Live ID(當時的舊稱為Microsoft Passport)服務以進行驗證。

授權 编辑

ASP.NET 的授權方式有兩種[17]

  • 檔案授權:由 ASP.NET 檢查檔案的 存取控制表 (ACL) 來授權存取權限。
  • URL授權:由開發人員設定的 URL 來給予權限。

一個 URL 授權的設定範例如下:

<authorization>  <allow users="Kim"/>  <allow roles="Admins"/>  <deny users="John"/>  <deny users="?"/> </authorization> 

Web Service支援 编辑

ASP.NET 1.0 開始支援 Web Service 的開發,是微軟在原生平台上支援 Web Service 發展的第一個實作品,但它卻不是微軟的第一個 Web Service 開發工具實作品[18],.NET Framework 中提供了一個 WSDL.exe,可以連接 Web Service 下載WSDL定義檔,並產生一個 Proxy Class 的原始碼,供用戶端應用程式使用,若是使用 Visual Studio 開發的話,這個動作會由「加入 Web 參考」的動作在背後處理掉。

ASP.NET Web Service 的發展只是平台的基礎,微軟在 Web Service 的開發上提供持續的支援,尤其是在 WS-I (Web Service Interoperability) 組織成立後,為符合 WS-I 的 Web Service 標準,微軟開發了強化 Web Service 的增強套件 Web Service Enhancement (WSE),最新版本為 3.0 版(搭配 ASP.NET 2.0),可支援許多 WS-I 的標準。

由於 Windows Communication Foundation 的推出,微軟將 Web Service 的發展重心移到 WCF 上,原有的 ASP.NET Web Service 即給定了一個名稱:ASMX Web Service

擴充功能 编辑

ASP.NET 在 2.0 版時,功能已大致底定,成為 Web 應用程式的基礎架構,微軟開始在 ASP.NET 2.0 上開發擴充的功能,包括 AJAX 的支援、MVC架構的支援以及更容易開發出資料庫應用的架構。

ASP.NET AJAX 编辑

ASP.NET AJAX 是微軟發展的 AJAX Framework,讓 ASP.NET 的開發人員得以用很簡單的方式就可以開發出支援 AJAX (AJAX-enabled) 的應用程式,包含用戶端指令碼的支援,以及伺服器端的連結等等。

ASP.NET MVC Framework 编辑

ASP.NET MVC Framework 是微軟基於 MVC (Model-View-Controller) 架構所開發的架構,讓應用程式各個模型可以在 MVC 架構下運行。

  • View:負責顯示資料以及使用者介面,在 ASP.NET MVC 架構下,View 可以支援 REST 樣式的 URL。
  • Model:負責定義資料的儲存,此部份可以由 LINQ to SQL 與 ADO.NET Entity Framework 來代替。
  • Controller:負責處理 View 和 Model 之間的聯繫。

ASP.NET MVC Framework 也支援以測試驅動的開發模式 (Test-Driven Development)。

ASP.NET Dynamic Data Framework 编辑

ASP.NET Dynamic Data Framework 是微軟在 ASP.NET 3.5 中開發的一組類別庫,封裝在 System.Web.DynamicData 命名空間中,並且配合 ASP.NET Routing Model(網頁繞送功能)讓開發人員可以很簡單的開發出基於 LINQ to SQL 或是 ADO.NET Entity Framework 資料模型的資料庫應用程式。

ASP.NET Routing 编辑

ASP.NET Routing Model(官方譯名為 ASP.NET 路由)是一個基於REST規格下的 URL 對應機制,開發人員可以在伺服器端設定 URL 的格式,使用者可以用由開發人員定義的 URL 格式瀏覽網頁,ASP.NET 會自動將 URL 轉換成為內部的 URL 格式,雖然它和 URL Rewriting 很像,但微軟認為 ASP.NET Routing 不是 URL Rewriting[19]

Silverlight 编辑

Silverlight 是微軟的新一代RIA技術,ASP.NET 3.5 Service Pack 1 (SP1) 中加入了對 Silverlight 2.0 的 ASP.NET 伺服器端支援,包含:

  • Silverlight控制項:讓伺服器端可以產生支援 Silverlight 的物件標記,以及自訂參數等。
  • Media控制項:讓伺服器端輸出以 Silverlight 為主的串流影音 (streaming media) 播放器。

開發工具 编辑

目前已有數個工具可支援 ASP.NET 應用程式的開發。

版本 编辑

在一台计算机上,查看Windows注册表

 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full 

其Version节点显示的就是所安装的ASP.NET的版本号。

日期 版本 說明 新功能
2002年1月16日 1.0 Visual Studio .NET一起發行的第一個版本
  • 物件導向的Web應用程開發,支援繼承多型與其他標準物件導向程式設計的功能。
  • 開發人員不再需要使用 Server.CreateObject(...),讓早期繫結與型別安全變得可能。
  • Microsoft Windows程式設計為基礎,開發人員能夠使用在Web Server上使用的DLL類別庫來建立許多能夠做到比只簡單的輸出 HTML 更多的魯棒性 (robust) 應用程式(例如例外處理功能)。
2003年4月24日 1.1 Windows Server 2003和Visual Studio .NET 2003一起發表。
  • 行動裝置控制項。
  • 自動化輸入驗證。
2005年11月7日 2.0

研發代號為Whidbey,和Visual Studio 2005、Visual Web Developer ExpressSQL Server 2005一起發表。

  • 新的資料控制項(GridView、FormView、DetailsView)
  • 新的宣告式資料存取技術(SqlDataSource、ObjectDataSource 與 XmlDataSource 控制項)
  • 導覽控制項(SiteMap、Menu、TreeView)
  • 主版頁面 (Master Page)
  • 登入控制項
  • 主題
  • 表皮 (skin)
  • Web 部件 (Web Part)
  • 個人化服務 (Profile)
  • 全功能的預先編譯能力
  • 全新的當地語系化技術
  • 支援64位元平台
  • 提供者類別模式
2007年11月19日 3.5 Visual Studio 2008Windows Server 2008一起發表
  • 新資料控制項(ListView、DataPager)
  • ASP.NET AJAX 內含到.NET Framework,成為.NET Framework的一部份。
  • 提供支援 LINQ 的 LinqDataSource 控制項。
2008年8月11日 3.5 Service Pack 1[21] 於 Visual Studio 2008 Service Pack 1 發表
  • 內含ASP.NET Dynamic Data
  • 在 ASP.NET AJAX 應用程式中支援瀏覽器歷史控制 (controlling browser history)。
  • 將多個JavaScript檔案合併到單一檔案以強化有效的下載。
2010年4月12日 4.0 Visual Studio 2010一起發表
  • 配合.NET Framework 4.0讓Web應用程式具有如並列運算函式庫(Parallel Library)等新功能。
  • ASP.NET MVC 2.0
  • jQuery完全整合與ASP.NET AJAX Client Library 強化,以及 AJAX CDN 的支援。
  • ASP.NET 的 Render Compatibility (3.5以前版本或4.0版),可控制許多 ASP.NET Web 控制項的繪製行為,以配合標準 HTML 與 jQuery 的處理。
  • SEO的支援。
  • 自訂快取提供者 (Extensible Output Cache)。
  • QueryExtender 的支援。
  • CSS 控制行為的變更。
  • 自訂的 Client ID 輸出。
  • ViewState 的控制。
  • 配合 Visual Studio 2010 的 Web Deploy 工具。
  • Entity Framework 4.0 的支援。
  • Dynamic Data Framework 與 Chart Control 內建至核心中。
2012年8月15日 4.5 Visual Studio 2012一起發表
2013年10月17日 舊版本,不再支援: 4.5.1 Visual Studio 2013[22]发布用于Windows Server 2012 R2Windows 8.1
  • Bootstrap 3.0
  • Web API 2: OAuth 2.0, OData改进, CORS
  • MVC 5: Attribute routing, authentication filters,filter overrides
  • EF 6
  • SignalR
  • OWIN
2014年5月5日[23] 舊版本,不再支援: 4.5.2
  • 更高可靠性的HTTP header检查与修改方法
  • 新的方式调度背景异步worker任务
2015年7月29日[23] 舊版本,不再支援: 4.6 发布于[24]Visual Studio 2015[25]EF 7预览版用于Windows Server 2016Windows 10
  • HTTP/2支持运行于 Windows 10
  • 更多的异步任务返回API
2015年11月30日[23] 舊版本,不再支援: 4.6.1
2016年8月2日[23] 舊版本,仍被支援: 4.6.2
  • 改进的异步支持(输出cache与session providers)
2017年4月11日[23] 舊版本,仍被支援: 4.7 包含在Windows 10 Creators Update[26]
  • 操作系统支持TLS协议
2017年10月17日[23] 當前版本: 4.7.1 包含在Windows 10 Fall Creators Update.[27]
  • 改进可访问性
  • Value tuple 类型序列化
  • SHA-2 支持
2018年5月1日[28] 當前版本: 4.7.2
2019年4月18日[29] 當前版本: 4.8 包含在 Windows 10 May 2019 Update 修复了ASP.NET的10个bugs
2015年11月18日 舊版本,不再支援: 5 RC1 这一版本后来从ASP.NET分开,改称ASP.NET Core 1.0.[30] 一个全新项目有不同的开发原则与目标。
格式:
舊版本
舊版本,仍被支援
当前版本
最新的预览版
未来版本

參見 编辑

參考資料 编辑

  1. ^ Release 3.3.0. 2023年10月24日 [2023年11月18日]. 
  2. ^ . [2009-01-18]. (原始内容存档于2010-05-27). 
  3. ^ Architecture Journal Profile: Scott Guthrie. [2009-01-18]. (原始内容于2009-01-12). 
  4. ^ 若是 IIS 5.x 時,則是轉交給網站的執行緒,IIS 6.0 以後的版本才有 Worker Process 的工作模型
  5. ^ ASP.NET Page Lifecycle Overview. [2009-01-18]. (原始内容于2009-01-18). 
  6. ^ 工作階段狀態模式. [2009-01-18]. (原始内容于2009-03-12). 
  7. ^ ASP.NET 網站巡覽. [2009-01-18]. (原始内容于2009-06-25). 
  8. ^ 使用成員資格管理使用者. [2009-01-18]. (原始内容于2008-12-25). 
  9. ^ 使用角色管理授權. [2009-01-18]. (原始内容于2008-12-25). 
  10. ^ ASP.NET 設定檔屬性概觀. [2009-01-18]. (原始内容于2009-06-25). 
  11. ^ Web 組件個人化概觀. [2009-01-18]. (原始内容于2009-06-24). 
  12. ^ ASP.NET 健康監視事件概觀. [2009-01-18]. (原始内容于2008-12-25). 
  13. ^ HTTP 處理常式和 HTTP 模組概觀. [2009-01-18]. (原始内容于2009-02-28). 
  14. ^ ASP.NET 主版頁面. [2009-01-18]. (原始内容于2009-06-24). 
  15. ^ ASP.NET 佈景主題和面板概觀. [2009-01-18]. (原始内容于2008-12-25). 
  16. ^ ASP.NET 驗證. [2009-01-18]. (原始内容于2009-06-24). 
  17. ^ ASP.NET 授權. [2009-01-18]. (原始内容于2009-06-25). 
  18. ^ 早期還有一個在 ASP 上發展 Web Service 的工具,稱為 SOAP Toolkit。
  19. ^ ASP.NET 路由. [2009-01-18]. (原始内容于2009-01-23). 
  20. ^ . [2009-01-18]. (原始内容存档于2009-01-23). 
  21. ^ ASP.NET in .NET 3.5 Service Pack 1. Microsoft. [2009-01-18]. (原始内容于2009-01-21). 
  22. ^ Announcing release of ASP.NET and Web Tools for Visual Studio 2013. [2018-10-16]. (原始内容于2015-12-08). 
  23. ^ 23.0 23.1 23.2 23.3 23.4 23.5 .net framework product lifecycle. [2018-10-16]. (原始内容于2018-10-16). 
  24. ^ Announcing .NET Framework 4.6. [2018-10-16]. (原始内容于2015-07-20). 
  25. ^ Visual Studio 2015 and Visual Studio 2013 Update 5 Released. msdn.com. Microsoft. [2018-10-16]. (原始内容于2015-09-04). 
  26. ^ Announcing the .NET Framework 4.7. [2018-10-16]. (原始内容于2018-07-10). 
  27. ^ Announcing the .NET Framework 4.7.1. [2018-12-21]. (原始内容于2017-12-31). 
  28. ^ Microsoft .NET Framework 4.7.2 正式版发布 2018年05月01日 cnBeta.COM. [2019年5月14日]. (原始内容于2019年5月14日). 
  29. ^ Announcing the .NET Framework 4.8. [2019-05-15]. (原始内容于2019-04-19). 
  30. ^ Releases. GitHub. [2018-10-16]. (原始内容于2018-04-10). 

外部連結 编辑

此條目需要补充更多来源, 2014年1月22日, 请协助補充多方面可靠来源以改善这篇条目, 无法查证的内容可能會因為异议提出而被移除, 致使用者, 请搜索一下条目的标题, 来源搜索, 网页, 新闻, 书籍, 学术, 图像, 以检查网络上是否存在该主题的更多可靠来源, 判定指引, 是由微軟在, framework框架中所提供, 開發web應用程式的類別庫, 封裝在system, dll檔案中, 顯露出system, web命名空間, 並提供網頁處理, 擴充以及http通道的應用程式與通訊處理等工作, 以及web, s. 此條目需要补充更多来源 2014年1月22日 请协助補充多方面可靠来源以改善这篇条目 无法查证的内容可能會因為异议提出而被移除 致使用者 请搜索一下条目的标题 来源搜索 ASP NET 网页 新闻 书籍 学术 图像 以检查网络上是否存在该主题的更多可靠来源 判定指引 ASP NET是由微軟在 NET Framework框架中所提供 開發Web應用程式的類別庫 封裝在System Web dll檔案中 顯露出System Web命名空間 並提供ASP NET網頁處理 擴充以及HTTP通道的應用程式與通訊處理等工作 以及Web Service的基礎架構 ASP NET是ASP技術的後繼者 但它的發展性要比ASP技術要強大許多 ASP NET開發者Microsoft首次发布2002年1月5日 21年前 2002 01 05 当前版本3 3 0 2023年10月24日 穩定版本 1 源代码库github wbr com wbr aspnet wbr AspNetWebStack编程语言 NET 程式語言 例如C VB NET类型Web應用程式许可协议Apache 2 0网站www asp netASP NET扩展名 aspx cshtml vbhtml互联网 媒体类型text html开发者MicrosoftASP NET可以運行在安裝了 NET Framework的IIS伺服器上 若要在非微軟的平台上執行 則需要使用Mono平台 2 ASP NET在2 0版本已經定型 在 NET Framework 3 5上則加上了許多功能 像是ASP NET AJAX ASP NET MVC Framework ASP NET Dynamic Data與Microsoft Silverlight的伺服器控制項等 很多人都把 ASP NET 當做是一種程式語言 但它實際上只是一個由 NET Framework 提供的一種開發平台 development platform 並非程式語言 也可认为ASP NET是 NET组件 任何 NET语言 例如C 可以引用该组件 创建网页或Web服务 為了因應雲端化所誘發的多作業平台整合與開發能力 微軟特別開發一個新一代的 ASP NET 稱為 ASP NET vNext 並於 2014 年命名為 ASP NET 5 但隨後於 2016 年將它更名為 ASP NET Core 由於架構上的差異頗大 因此未來 ASP NET 與 ASP NET Core 將是分別發展與維護 Windows 平台的 ASP NET 4 6 以上版本仍維持 Windows Only 但 ASP NET Core 則是具有跨平台 Windows Mac OSX 與 Linux 的能力 目录 1 發展緣起 2 ASP NET處理架構 2 1 Web伺服器的訊息流動階段 2 2 ASP NET網頁中的事件程序 2 3 ASP NET的事件模型 2 4 ASP NET的來回模式 2 5 繪製技術 3 狀態管理 3 1 應用程式層級物件 3 2 連線層級物件 3 3 跨機器狀態管理 4 部件 4 1 基礎部件 4 1 1 網頁 4 1 2 控制項 4 1 3 指令碼 4 1 4 基本物件 4 2 導覽部件 4 3 應用程式服務 4 4 延展性支援 5 一致性與多樣性介面的支援 6 編譯模型 7 安全性支援 7 1 驗證 7 2 授權 8 Web Service支援 9 擴充功能 9 1 ASP NET AJAX 9 2 ASP NET MVC Framework 9 3 ASP NET Dynamic Data Framework 9 4 ASP NET Routing 9 5 Silverlight 10 開發工具 11 版本 12 參見 13 參考資料 14 外部連結發展緣起 编辑 nbsp 斯科特 格思里 英语 Scott Guthrie ASP NET的前身ASP技術 是在IIS 2 0上首次推出 Windows NT 3 51 當時與 ADO 1 0 一起推出 在IIS 3 0 Windows NT 4 0 發揚光大 成為伺服器端應用程式的熱門開發工具 微軟還特別為它量身打造了Visual InterDev開發工具 在1994年到2000年之間 ASP技術已經成為微軟推展Windows NT 4 0平台的關鍵技術之一 數以萬計的ASP網站也是這個時候開始如雨後春筍般的出現在網路上 由於它的簡單以及高度客制化的能力 也是它能迅速竄起的原因之一 不過ASP的缺點也逐漸的浮現出來 義大利麵型的程式開發方法 讓維護的難度提高很多 尤其是大型的ASP應用程式 直譯式的VBScript或JScript語言 讓效能有些許的受限 延展性因為其基礎架構擴充性不足而受限 雖然有COM元件可用 但開發一些特殊功能 像檔案上傳 時 沒有來自內建的支援 需要尋求第三方軟體商開發的元件 1997年時 微軟開始針對ASP的缺點 尤其是義大利麵型的程式開發方法 準備開始一個新專案來開發 當時ASP NET的主要領導人斯科特 格思里 英语 Scott Guthrie 剛從杜克大學畢業 他和IIS團隊的Mark Anders經理一起合作兩個月 開發出了下一代ASP技術的原型 這個原型在1997年的聖誕節時被發展出來 並給予一個名稱 XSP 3 這個原型產品使用的是Java語言 不過它馬上就被納入當時還在開發中的CLR平台 Scott Guthrie事後也認為將這個技術移植到當時的CLR平台 確實有很大的風險 huge risk 但當時的XSP團隊卻是以CLR開發應用的第一個團隊 為了將XSP移植到CLR中 XSP團隊將XSP的核心程式全部以C 語言重新撰寫 在內部的專案代號是 Project Cool 但是當時對公開場合是保密的 並且改名為ASP 作為ASP技術的後繼者 並且也會提供一個簡單的移轉方法給ASP開發人員 ASP 首次的Beta版本以及應用在PDC 2000中亮相 由Bill Gates发表Keynote 即關鍵技術的概覽 由富士通公司展示使用COBOL語言撰寫ASP 應用程式 並且宣布它可以使用Visual Basic NET C Perl與Python語言 後兩者由ActiveState公司開發的互通工具支援 來開發 在2000年第二季時 微軟正式推動 NET策略 ASP 也順理成章的改名為ASP NET 經過四年的開發 第一個版本的ASP NET在2002年1月5日亮相 和 NET Framework 1 0 Scott Guthrie也成為ASP NET的產品經理 到現在已經開發了數個微軟產品 像ASP NET AJAX和Microsoft Silverlight ASP NET處理架構 编辑ASP NET 運行的架構分為幾個階段 在 IIS 與 Web 伺服器中的訊息流動階段 在 ASP NET 網頁中的訊息分派 在 ASP NET 網頁中的訊息處理 Web伺服器的訊息流動階段 编辑 nbsp ASP NET執行架構當裝載 hosting ASP NET 的 Web 伺服器接收到 HTTP 请求時 HTTP 聆聽程式 HTTP Listener 实际上是内核态的HTTP SYS 會將请求轉交給 URL 指定的網站應用程式池中的工作者进程 Worker Process 4 ASP NET 的工作者进程接收到这个请求之后 装载专用于处理ASP NET页面的一个ISAPI扩展 aspnet isapi dll 并将HTTP请求传给它 若是 IIS 5 0 時則是 aspnet wp exe aspnet isapi dll负责加载ASP NET应用程序的运行环境CLR IIS 7集成模式下 CLR是预加载的 每个ASP NET应用程序都运行于自己的应用程序域 AppDomain 中 每个应用程序域都对应着一个ApplicationManager类的实例 通过AppManagerAppDomainFactory创建 负责管理运行在域中的ASP NET应用程序 启动和停止一个ASP NET应用程序 创建对象等 ApplicationManager还会创建一个HostingEnvironment对象 提供了ASP NET应用程序的一些管理信息 如ASP NET应用程序的标识 虚拟目录与对应的物理目录等 应用程序域创建完成之后 创建 System Web Hosting 命名空間中的基于ISAPIRuntime的一个对象 调用其ProcessRequest 方法 在此方法中 根据传入的HTTP请求信息屏蔽了版本差异化后封装实例化了一个HttpWorkerRequest的对象并初始化一个HttpRuntime对象 调用HttpRuntime的ProcessRequestInternal方法 ProcessRequestInternal方法实例化一个HttpContext对象 其构造函数内部又实例化了在ASP NET编程中非常重要的HttpRequest和HttpResponse对象 通过HttpApplicationFactory获取HttpApplication对象实例 再调用HttpApplication对象的BeginProcessRequest方法启动整个HTTP请求的处理过程 即HTTP管线模式 System Web UI Page类提供了 Requset 和 Response 属性来引用这两个对象 因此在ASP NET网页中可以直接访问这两个对象 同样 System Web UI Page类的Context属性引用HttpContext对象 HttpRuntime类的ProcessRequest 方法除了创建HttpContext对象之外 还完成了另一个很重要的工作 向HttpApplicationFactory类的一个实例 它管理一个HttpApplication对象池 申请分配一个HttpApplication对象用于管理整个 HTTP请求处理管线 HTTP Pipeline 中的各种事件的激发 在HttpApplication对象的InitModules 方法中创建HTTP模块 HTTP Module 通常在HTTP模块对象 实现IHttpModule接口 的Init 方法中响应HttpApplication对象所激发的特定事件 开发者可以创建基于IHttpHandler接口的对象 在Web Config中插入特定的内容可以将自定义的HTTP模块加入到HTTP请求的处理流程中 在IIS6和IIS7经典模式下 是用 Event 事件名称做key将所有事件的保存在HttpApplication的Events属性对象里 然后在BuildSteps里统一按照顺序组装 在IIS7集成模式下 是通过HttpModule名称 RequestNotification枚举值作为key将所有的事件保存在HttpApplication的ModuleContainers属性对象里 这个属性的类型是PipelineModuleStepContainer HTTP请求处理管线 HTTP Pipeline 的处理过程为 预处理阶段 由多个HTTP模块参与 通过事件来驱动 主要是对HttpContext对象的各种属性进行修改 处理阶段 由System Web UI Page类接手HttpContext对象 Page类实现了IHttpHandler接口 因此有ProcessRequest 方法并被自动调用 ProcessRequest 方法的执行结果刷新了HttpContext对象的内容 后处理阶段 HttpApplication对象继续激发后继的事件 如果有特定的HTTP模块响应这些事件 则它们会被自动调用 在管线末端 信息傳回到 ISAPIRuntime 以及 aspnet isapi dll 最後交由 HTTP Listener 回傳給用戶端 当HTTP请求处理完毕 相关的对象被释放 但创建的应用程序域 以及HttpApplication等对象仍然存活 以响应下一次HTTP请求 具体的处理管线 BeginRequest 开始处理请求 当ASP NET运行时接收到新的HTTP请求的时候引发这个事件 AuthenticateRequest授权验证请求 获取用户授权信息 当ASP NET 运行时准备验证用户身份的时候引发这个事件 PostAuthenticateRequest 验证身份成功 通过HttpContext User获取 AunthorizeRequest 用户权限授权 当ASP NET运行时准备授权用户访问资源的时候引发这个事件 PostAuthorizeRequest 获得授权 ResolveRequestCache 获取页面缓存结果 如果存在直接返回结果 PostResolveRequestCache 缓存检查结束 MapRequestHandler IIS7集成模式才支持 查找并创建HttpHandler 根据URL路径或扩展名和匹配规则查找创建 赋值给HttpContext Handler属性 仅限于IIS6与IIS7经典模式 PostMapRequestHandler 成功创建IHttpHanlder对象 AcquireRequestState 获取请求状态 一般用于获取Session 先判断当前页面对象是否实现了IRequiresSessionState接口 如果实现了 则从浏览器发来的请求报文体中获得SessionID 并到服务器的Session池中获得对应的Session对象 最后赋值给HttpContext的Session属性 PostAcquireRequestState 成功获得Session PreRequestHandlerExecute 准备执行HttpHandler处理程序 执行HttpHandler处理程序 仅限于IIS6与IIS7经典模式 调用HttpHandler的ProcessRequest方法 同步 或BeginProcessRequest方法 异步 PostRequestHandlerExecute 执行HttpHandler处理程序结束 ReleaseRequestState 准备释放请求状态 Session PostReleaseRequestState 成功释放请求状态 Session Filter 将内容写入Filter 仅限于IIS6与IIS7经典模式 UpdateRequestCache 更新缓存 Filter 将内容写入Filter 仅限于IIS7集成模式 PostUpdateRequestCache 已更新缓存 LogRequest 为当前请求执行日志记录 仅限于IIS7集成模式 PostLogRequest 已完成日志 仅限于IIS7集成模式 EndRequest 完成 把响应内容发送到客户端之前引发这个事件 Noop 扩展使用 仅限于IIS6与IIS7经典模式 PreSendRequestHeaders 根据发送的Headers动态设置一些参数 仅限于IIS7集成模式 PreSendRequestContent 可对输出内容做压缩 仅限于IIS7集成模式 在 ASP NET 內部的 HTTP 處理器有 ISAPIRuntime 由 aspnet isapi dll 呼叫 初始化 HttpWorkerRequest 物件 會由IIS的版本決定要初始化的版本 HttpRuntime 提供请求佇列 Request Queue 呼叫 HttpWorkerRequest 中的 ProcessRequest 方法 以及後續的處理工作 HttpWorkerRequest 產生 HttpApplication HttpRequest HttpResponse 等基礎物件的 HTTP 请求物件 並將要求轉送到要處理的物件 並呼叫它的 ProcessRequest 方法 IHttpHandler 與 IHttpAsyncHandler 負責處理 HTTP 请求的單元 由 ProcessRequest 來分派與執行请求 ASP NET網頁中的事件程序 编辑 當 HttpWorkerRequest 呼叫 ASP NET 網頁 System Web UI 命名空間的 Page 類別 的 Page ProcessRequest 方法時 它會依序的引發 Page 內的各個事件 並同時呼叫在 Page 中所有控制項的相關事件 其引發順序為 5 启动阶段 设置页面基本属性 如 Request 和 Response 在此阶段 页面还将确定请求是回发请求还是新请求 并设置 IsPostBack 属性 PreInit 事件 執行預先初始化的工作 在ASP NET 2 0中 若要動態調整主版頁面 Master Page 佈景主題 Theme 時 要在這個事件中調整 设置页面一些最基本的特性 如加载个性化信息和主题 运行时Culture Init 事件 執行初始化工作 根据页面的服务器标签及其属性设置 生成各个服务器控件的实例和给这些服务器控件的实例的属性进行赋值 并存入ViewState 但因为本阶段的赋值行为优先于ViewState的TrackViewState被调用 所以这些视图的值都将不会存入最终呈现的视图状态隐藏字段中 InitCompleted 事件 在完成初始化工作後引發 调用ViewState的TrackViewState方法 开启对视图状态更改的跟踪 Preload 事件 載入表单传值 页面方法调用LoadViewState LoadControlState ProcessPostData 服务器控件对应调用LoadViewState和实现IPostBackDataHandler接口的LoadPostData方法 Load 事件 執行載入的工作 大多數的網頁都擁有 Page Load 事件處理常式 使用者控制項 user control 中也有 Page Load 事件常式 都會在此時呼叫 控制項的 PostBack 變更通知 當網頁偵測到是 PostBack 要求時 會引發 PostBack 訊息通知的事件 控制項的 PostBack 相關事件 當網頁偵測到是 PostBack 要求時 會引發 PostBack 訊息指定的控制項的事件 LoadCompleted 事件 執行載入完成後的工作 PreRender 事件 處理在產生 HTML 結果前的工作 SaveStateCompleted 事件 處理頁面狀態 ViewState 與 ControlState 儲存完成後的事件 Render 事件 處理產生 HTML 的工作 Unload 事件 處理結束網頁處理時的工作 如果 HttpWorkerRequest 呼叫的是實作 IHttpHandler 介面的 HTTP 處理常式 時 它只會呼叫 IHttpHandler ProcessRequest 方法 由它來處理程式的輸出 不像 Page ProcessRequest 會處理事件順序 因此 HTTP Handler 很適合輕量級的資料處理 像是輸出檔案資料流或是圖片資料流等 ASP NET的事件模型 编辑 ASP NET 的原始設計構想 就是要讓開發人員能夠像 VB 開發工具那樣 可以使用事件驅動式程式開發模式 Event Driven Programming Model 的方法來開發網頁與應用程式 若要以ASP技術來做到這件事的話 就必須要使用大量的輔助資訊 像是查詢字串或是表單欄位資料來識別與判斷物件的來源 事件流向以及呼叫的函式等等 需要撰寫的程式碼量相當的多 但 ASP NET 很巧妙利用表單欄位和JavaScript指令碼把事件的傳遞模型隱藏起來了 ASP NET 的事件模型是由 lt form runat server gt lt form gt 以及數個 Hidden Field 組合而成 基於 HTTP 模型的限制 所有的網頁程式在執行結果輸出到用戶端後 程式就會結束執行 為了維護在 ASP NET 網頁與控制項的狀態資料 因此在輸出 ASP NET 控制項時 ASP NET 會將部份狀態資料儲存到網頁的 Hidden Field 中 這類型的狀態資料稱為 ViewState ID 為 VIEWSTATE 在伺服器端即會被解譯出狀態與事件資料 在大多數的內建 Web 控制項中都有使用到這個機制 因此在使用大量 ASP NET Web 控制項的網頁中 會有許多的 ViewState 會存放在網頁中並隨著 HTTP 資料流輸出到用戶端 ViewState 在輸出時 會被加密為一組亂碼字串 其金鑰值定義在電腦中 並且每一個物件都會被序列化 serialize 成字串 因此若是自訂物件要放到 ViewState 時 則應要讓它支援序列化 再輸出到 VIEWSTATE 欄位中 在每次的網頁來回時都會被傳輸 較大的 ViewState 會讓網頁大小膨脹 不利於快速的網路傳輸 不過 ASP NET 本身有提供將 ViewState 關閉的功能 因此如果控制項不需要狀態保存時 可將它關閉以減少輸出的大小 為確保控制項的事件能夠確實被引發 讓事件驅動能夠被執行 因此控制項事件引發命令時需要的參數 是交由 JavaScript 指令碼在用戶端引發時 填入另一個 Hidden Field ID 為 EVENTTARGET 以及 EVENTARGUMENT 並且引發表單的送出指示 submit 傳送到伺服端後 伺服端的 HttpApplication 中的工具函式會解析 EVENTTARGET 和 EVENTARGUMENT 欄位中的資訊 並且交由控制項所實作的 RaisePostBackEvent 來引發事件 並由 NET Framework 內部的事件處理機制接手處理 呼叫控制項設定的事件處理常式 ASP NET的來回模式 编辑 nbsp 在 ASP NET 運行的時候 經常會有網頁的來回動作 round trip 在 ASP NET 中稱為 PostBack 在傳統的 ASP 技術上 判斷網頁的來回是需要由開發人員自行撰寫 到了 ASP NET 時 開發人員可以用 Page IsPostBack 機能來判斷是否為第一次執行 當 ASP NET 發現 HTTP POST 要求的資料是空值時 它可以保證 ASP NET 的控制項事件只會執行一次 但是它有個缺點 基於 HTTP POST 本身的缺陷 就是若使用者使用瀏覽器的重新整理功能 按 F5 或重新整理的按鈕 刷新網頁時 最後一次執行的事件會再被執行一次 若要避免這個狀況 必須要強迫瀏覽器清空快取才可以 ASP NET 2 0 中有新增三個來回模式 Cross Page Postback 允許跨不同的網頁執行 PostBack 伺服端可使用 Page IsCrossPostBack 來判斷是否是跨網頁型的來回 Async Page Mode 允許網頁使用非同步的方式執行 伺服端可用 Page IsAsync 來判斷 Callback ASP NET 2 0 新增的由網頁回呼用戶端指令的功能 伺服端可用 Page IsCallback 來判斷是否要求是來自 Callback 來回模式不僅是 ASP NET 運作時的核心 它也是 ASP NET 應用程式的一個主要缺點 尤其是在設計複雜度高的頁面時 在網頁中隱藏的 ViewState 的大小會相當大 而在每次的來回動作中 都會傳送 ViewState 在內的表單資訊 大量的 ViewState 會使得傳送的時間拉長 而且每次來回動作都會讓整個網頁被刷新 而出現閃爍的情況 就算在本地端也一樣 但在AJAX技術尚未成熟時 只能夠忍受這種因底層限制所帶來的問題 在ASP NET AJAX技術發展出來後 透過UpdatePanel成功的緩解了這個問題 但 ViewState 傳送的問題仍然未根本的解決 必須要使用像 Page Method 這樣的方式才能徹底的解決 繪製技術 编辑 熟悉 ASP 技術的人都知道 程式碼都是混在 HTML 標籤之間 以輸出預期需要的 HTML 指令 這個技術在 ASP NET 中 由各控制項的繪製 Render 機制包裝起來了 繪製機制裝載了 HtmlTextWriter 物件 由它來產生 HTML 指令 它會輸出至 HttpContext 的 Response 輸出資料流中 即 ASP 技術的 Response Write 下列程式碼為繪製技術的示例 System Security Permissions PermissionSet System Security Permissions SecurityAction Demand Name FullTrust protected override void Render HtmlTextWriter output if HasControls amp amp Controls 0 is LiteralControl output Write lt H2 gt Your Message LiteralControl Controls 0 Text lt H2 gt 為了讓控制項的輸出有階層性 ASP NET 開發了一個可以階層化輸出控制項 HTML 指令的方式 稱為控制項樹 Control Tree 藉由控制項樹 可以讓各個控制項的輸出可以階層化 不論是否是收納型控制項 還是一般型的控制項 都可以按照控制項的順序來輸出 狀態管理 编辑狀態管理 state management 在Web應用程式中 一向是很重要的課題 良好的狀態管理可以幫助開發人員發展出具有狀態持續能力的應用程式 像是工作流程型應用程式或是電子商務應用程式 但狀態管理功能會視應用程式的部署狀態以及資訊的共用程度來選擇 在 ASP NET 中 分為伺服器端狀態管理以及用戶端狀態管理 用戶端狀態管理為ViewState以及Cookies 伺服端狀態管理則是Session與Application物件 它們的差異點在於 ViewState 是加密的資料流 和 HTML 一起輸出到用戶端 Cookies 是加密 也可不加密 的小型資料 和 HTML 不同 它可以快取在用戶端瀏覽器中 Session 是伺服器端的狀態保存機制 每個用戶端均有獨立的空間 以瀏覽器執行個體來賦與唯一的SessionID值 Application 是伺服器端的狀態保存機制 但應用程式所有的用戶端共用同一份狀態資料 應用程式層級物件 编辑 Application 物件會在應用程式的 Application OnStart 事件中初始化 並使用名稱來識別資料 它是一個 NameObjectCollectionBase 集合的實作品 它會儲存在應用程式的範圍內 所有的連線 使用者 都可以使用 屬於共用型的儲存體 適合儲存所有使用者都可使用的資料 在多人使用的情況下 可以適當的使用 Lock Unlock 的機制來確保應用程式狀態的更新 Application Lock Application PageRequestCount int Application PageRequestCount 1 Application UnLock 連線層級物件 编辑 連線層級的物件是 Session 以瀏覽器的執行個體為識別單位 資料依瀏覽器的執行個體來儲存 在瀏覽器的執行個體第一次連到應用程式時 ASP NET會設定一個Session ID 並且使用它來識別 Session 每一個 Session 都是 ICollection 與 IEnumerate 的實作 用 key 來識別資料值 並且具有時間的限制 timeout 若超出時限時伺服器會自動清理掉 預設的 Session 時限為 20 分鐘 Session ID 的演算法是由 RNGCryptoServiceProvider 密碼編譯亂數產生器提供者 產生 並編碼成一個 Session ID 字串 例如 anf4vuup3xiq0arjlqla2l55 這樣的字串 儲存在伺服器中 用以識別不同的 Session 個體 為因應不同的用戶端 ASP NET 設計了不同的 Session ID 存放機制 像是舊式的瀏覽器或是行動用戶端這種不支援本地儲存cookie的裝置時 ASP NET 可以直接在 URL 中加上 Session ID 的識別 像是 http www example org anf4vuup3xiq0arjlqla2l55 profile aspx 這樣的 URL 可以由開發人員自行設定 或是使用 AutoDetect 設定來讓 ASP NET 自行判斷要使用的 Session ID 存放方式 Session ID 的產生方法可以由程式開發人員自訂 藉由覆寫 SessionIDManager 的 CreateSessionID 方法來自訂 using System using System Configuration using System Web Configuration using System Web using System Web SessionState namespace Samples AspNet Session public class GuidSessionIDManager SessionIDManager public override string CreateSessionID HttpContext context return Guid NewGuid ToString public override bool Validate string id try Guid testGuid new Guid id if id testGuid ToString return true catch return false 跨機器狀態管理 编辑 狀態管理在單一伺服器上 可以儲存在伺服器的記憶體中 但若是在大型網站中 使用許多的 Web 伺服器來實行負載平衡 Load Balancing 處理時 會有狀態儲存在哪個位置的問題 因此需要有一個可以在每個 Web 伺服器之間做狀態儲存的媒介 像是獨立的伺服器或是資料庫等等 在 ASP NET 中支援了四種狀態儲存的媒介 6 InProc 儲存與 ASP NET 相同的執行行程中 in procedure state 適合單一伺服器的狀態儲存 StateServer 儲存在 ASP NET 狀態伺服器 state server 中 適合跨伺服器的狀態儲存 但因為它使用的通訊埠 因此在使用上需要注意防火牆的問題 SQLServer 儲存在獨立的 SQL Server 資料庫中 適合跨伺服器的狀態儲存 Custom 以自行實作的狀態提供者 state provider 部件 编辑ASP NET 是開發 Web 應用程式的基礎架構 framework 除了它內部的運作方法外 對外也顯露了許多的開發支援 讓開發人員可以利用它來發展出許多強大的 Web 應用程式解決方案 基礎部件 编辑 網頁 编辑 ASP NET 最基礎的底層為網頁 Page 網頁由 System Web UI Page 類別來提供基礎支援 包含了頁面的事件以及物件繪製的引發點 Page 類別本身是一個 HTTP Handler 的實作品 ASP NET 網頁在微軟的官方名稱中 稱為 Web Form 除了是要和Windows Forms作分別以外 同時也明白的刻劃出了它的主要功能 讓開發人員能夠像開發 Windows Forms 一樣的方法來發展 Web 網頁 因此 ASP NET Page 所要提供的功能就需要類似 Windows Forms 的表單 每個 Web Form 都要有一個 lt form runat server gt lt form gt 區塊 所有的 ASP NET 伺服器控制項都要放在這個區域中 這樣才可以讓 ViewState 等伺服器控制能夠順暢的運作 在網頁中也可以使用程式碼 以類似於ASP時代的撰寫方式來開發 此種開發方式稱為 inline code 在 ASP NET 的程式開發模式中 inline code 要放在 lt script runat server gt lt script gt 區域中 如下列的範例程式 lt Page Language C gt lt DOCTYPE html PUBLIC W3C DTD XHTML 1 0 Transitional EN http www w3 org TR xhtml1 DTD xhtml1 transitional dtd gt lt script runat server gt protected void Page Load object sender EventArgs e Label1 Text DateTime Now ToLongDateString lt script gt lt html xmlns http www w3 org 1999 xhtml gt lt head runat server gt lt title gt Sample page lt title gt lt head gt lt body gt lt form id form1 runat server gt lt div gt The current time is lt asp Label runat server id Label1 gt lt div gt lt form gt lt body gt lt html gt 另一種模式則是將程式碼和網頁分離 這種模式稱為程式碼後置 Code Behind 這個方法可以將程式碼獨立到一個檔案中 網頁可以保持較乾淨的狀態 讓維護網頁程式的複雜度降低很多 在網頁的提示指令 directive 中 可以設定程式碼後置的參數 像是 Inherit CodeFile Class 等參數 lt Page Language C CodeFile SampleCodeBehind aspx cs Inherits Website SampleCodeBehind AutoEventWireup true gt 而一個典型的程式碼後置例子為 using System namespace Website public partial class SampleCodeBehind System Web UI Page protected override void Page Load EventArgs e base OnLoad e 使用程式碼後置模式的設定時 可以讓 ASP NET 執行引擎在載入網頁時 由程式碼後置參數取得對應的類別資訊 藉以使用 Reflection 的方式來執行後置的程式碼 ASP NET 可以支援HTML和XHTML兩種網頁內容 但在Visual Studio NET中 預設是使用 HTML 但在Visual Studio 2005以後的版本 則一律都改用XHTML格式 控制項 编辑 ASP NET 的內建控制項分為兩種 HTML 控制項 HTML control 直接在 HTML 標記中加上 runat server 即可對應到 ASP NET 指定的 HTML 伺服器控制項類別 像是 HtmlAnchor 表示 HTML 的 lt a gt HtmlButton 表示 HTML 的 lt input type button gt HtmlImage 表示 HTML 的 lt img gt HtmlGenericControl 表示沒有對應到伺服器控制項的物件 都會被對應到這個類別 Web 控制項 Web control 由 ASP NET 提供 比 HTML 控制項提供更多的功能 但操作與設定會比 HTML 控制項要複雜許多 像是 LinkButton 一種外型為連結 lt a gt 的按鈕 CheckBoxList 建立 CheckBox 的清單的控制項 GridView 將資料繫結並產生 HTML 表格的控制項 RequiredFieldValidator 檢查欄位是否有輸入資料的控制項 除了內建的控制項之外 ASP NET 也提供了可以自訂的控制項架構 並且支援兩種控制項開發方法 使用者控制項 User control 以 ascx 為副檔名 可以讓開發人員用最輕鬆的方式來開發控制項 優點是開發速度很快 但缺點是無法轉散布 且無法加入參考 自訂控制項 Custom control 可轉散布型的控制項 是經過編譯後的程式碼 DLL 可單獨轉散布 並且可在其他的專案加入參考取用 自訂控制項有三種開發模式 基礎控制項 General Control 由 System Web UI Control 類別繼承而來 或是由現有的 Web 控制項繼承而來 像是由 Button 控制項繼承 複合控制項 Composite Control 由 System Web UI WebControls CompositeControl 繼承而來 可以用複合的方式來開發控制項 樣板控制項 Template Control 可以在控制項中使用樣板 template 並套用資料到樣板中 支援資料繫結的運算式 指令碼 编辑 ASP NET 的 Web 控制項有時會包裝一些用戶端指令碼 client side scripting 在控制項被繪製時輸出到用戶端 這些指令碼多數被包裝在 DLL 的資源檔中 並由 ScriptResource axd 處理常式來輸出 開發人員也可以利用 ClientScriptManager Page ClientScript 屬性 中的方法來添加指令碼到網頁程式中 常用的方法有 ClientScriptManager RegisterClientScriptBlock 註冊用戶端指令碼區塊 script block ClientScriptManager RegisterStartupScript 註冊在起始時執行的指令碼 ClientScriptManager RegisterOnSubmitStatement 註冊在處理表單發送時要執行的指令碼 ClientScriptManager RegisterClientScriptInclude 註冊由外部檔案 js 提供的指令碼來源 基本物件 编辑 以往在 ASP 中常被使用的五大基本物件 在 ASP NET 中仍然持續被支援 但它們都換了一個身份來提供 Application 包裝了 HttpApplication 物件 在程式中使用 Application 指令取得的物件 都是來自於 HttpContext Current Application 屬性回傳而得 Request 包裝了 HttpRequest 物件 在程式中使用 Request 指令取得的物件 都是來自於 HttpContext Current Request 屬性回傳而得 Response 包裝了 HttpResponse 物件 在程式中使用 Response 指令取得的物件 都是來自於 HttpContext Current Response 屬性回傳而得 Session 包裝了 HttpSessionState 物件 在程式中使用 Session 指令取得的物件 都是來自於 HttpContext Current Session 屬性回傳而得 Server 包裝了 HttpServerUtility 物件 在程式中使用 Server 指令取得的物件 都是來自於 HttpContext Current Server 屬性回傳而得 導覽部件 编辑 導覽部件 navigation controls 7 是在 ASP NET 2 0 中才出現的功能 包含 選單 Menu 提供內建的滑鼠偵測方式 實作階層式的選單功能 網站地圖 Sitemap 提供可層次化目前瀏覽位置的功能 可支援由 Web sitemap 中的資料 或是來自資料庫或 XML 資料檔中的資料來源 樹狀檢視 TreeView 提供階層化的資料瀏覽 類似於檔案總管的介面 應用程式服務 编辑 應用程式服務 application services 是在 ASP NET 2 0 中才開始提供 它以 Provider based Pattern 為主 實作出數個網站的常用服務 包含會員服務 Membership Service 8 角色服務 role service 9 與設定檔服務 profile service 10 等 會員服務由 Membership 以及其資料提供者 MembershipProvider 構成 應用程式使用 Membership 所顯露的方法來操作 它會將要求轉送給指定的 MembershipProvider 實作來處理 ASP NET 目前支援來自於資料庫的 SqlMembershipProvider 支援 SQL Server 以及來自於Active Directory的 ActiveDirectoryMembershipProvider 開發人員也可以自行由 MembershipProvider 繼承來實作自訂的會員服務資料提供者 角色服務與會員服務類似 由 Role 以及其資料提供者 RoleProvider 構成 應用程式使用 Role 所顯露的方法操作 由 RoleProvider 實作提供資料服務 目前內建的 RoleProvider 有來自 Active Directory 或 XML 檔案的 AuthorizationStoreRoleProvider 由 SQL Server 供應資料的 SqlRoleProvider 以及支援 Windows 角色的 WindowsTokenRoleProvider 三種 開發人員可自行實作 RoleProvider 的方法以發展出自訂的角色服務提供者 設定檔服務是一個特殊的服務 它結合了 NET Framework 的 CodeDOM 開發模式 以及 System Web Profile 命名空間的 ProfileBase ProfileInfo 與 ProfileManager 等類別 組合出完整的設定檔支援 其資料來源也是以 Provider based Pattern 為主 由 ProfileProvider 提供 ASP NET 內建由 SQL Server 資料庫建立的 SqlProfileProvider 其欄位係由開發人員在 ASP NET 組態檔中自行定義 再由 ASP NET 動態產生強型別的欄位屬性 設定檔服務也是作為 ASP NET 2 0 的網頁組件 Web Part Framework 所需要的設定檔儲存支援 11 Web Part Framework 可以讓開發人員可以開發出具備個人化能力 Personalization 的網頁配置方案 讓使用者可以用自行新增與拖放的方式來設計自己的網頁佈置 所需要的設定儲存即由設定檔服務處理 另一個需要和應用程式服務配合使用的功能為 Web 事件架構 Web Event Framework 12 它需要由應用程式服務提供資料結構 它也有 Provider based Pattern 並可以支援數種的事件資料提供者 延展性支援 编辑 除了 ASP NET 網頁以外 NET Framework 還提供了兩種可以由開發人員自行發展處理模型的模組 一種是HTTP Handler 另一種則是HTTP Module 13 HTTP Handler 副檔名為 ashx 由 System Web IHttpHandler 介面定義了必要的方法 可支援非同步的 HTTP Handler 稱為 HTTP Async Handler 由 System Web IHttpAsyncHandler 介面定義 其中最重要的方法是 ProcessRequest 方法 開發人員必須要實作這個方法 才能夠讓 HTTP Handler 有作用 它也可以透過 ASP NET 的組態設定 讓 HTTP Handler 可以處理特定的副檔名 它可以被視為 NET Framework 中的 ISAPI Extensions 實作方法 HTTP Module 則是由 System Web IHttpModule 介面定義 它可以在整個網頁生命週期中被呼叫多次 並實際處理由 HttpApplication 所引發的事件 開發人員需要實作 IHttpModule Init 方法 以及處理 HttpApplication 事件需要的程式碼 它可被視為 NET Framework 中的 ISAPI Filter 實作方法 一致性與多樣性介面的支援 编辑ASP NET 在一開始的時候是缺乏範本引擎 template engine 的 其主因是 NET Framework本身是物件導向 且需要用繼承的方式才能夠延伸功能 大多數的開發人員都是由 System Web UI Page 繼承並定義出新的基礎類別 並撰寫要繪製 HTML 的方法 以及在他們的應用程式中修改以繼承該類別 然而這個方法可能會被用在網站的很多地方 因而會大大的提升混合程式碼與標記的複雜度 這個方法也只能在執行期才能夠以視覺化的方式測試 無法在設計時期視覺化 其他的開發人員總是使用原有的 ASP 方法 即 lt include gt 指令 來把每個網頁需要的部份包到網頁中 防止在每個網頁中都要撰寫相同的導覽程式碼 在 ASP NET 2 0 中 推出了母板頁面 master page 的概念 14 它可以讓開發人員先行定義外觀版型 master 再使用它來套用實際執行的網頁 網頁與主版頁面之間以 ContentPlaceHolder 的 ID 做連結 以套用正確的內容到保留區 即由 ContentPlaceHolder 包住的區域 中 開發人員也可以定義在保留區沒有套用時需要顯示的預設內容 在 ASP NET 3 5 中更進一步的支援設計時期的巢狀主版頁面 nested master pages 以及把網頁的 HEAD 區塊納入 ContentPlaceHolder 的範圍 與主版頁面相關的 還有主題 Theme 以及面板 skin 技術 15 這兩個技術允許開發人員或設計人員自行定義網頁的樣式設定以及套用的樣式支援 每個主題中可以包含數個面板檔 這些面板檔決定了控制項要輸出時套用的樣式 開發人員則可以利用主題來決定不同的外觀要使用的樣式 ASP NET 也允許在應用程式中動態的變更主版頁面與主題 但必須要在頁面的 PreInit 事件常式設定 void Page PreInit Object sender EventArgs e Page MasterPageFile NewMaster master Page Theme MyTheme 編譯模型 编辑ASP NET 在 1 x 時 使用的是組件為主的編譯方式 一個網頁只會產生一個組件 這個方式最大的優點 就是可以自由定義命名空間 且在部署應用程式時會比較方便 但由於 ASP NET 1 x 所處的時代 如果網站是有許多程式碼的情況下 即 DLL 檔很大 載入的速度會變慢 且佔用記憶體的量會很多 當時的記憶體價格也尚未降到現在的水準 因此在 ASP NET 2 0 開始 另外提供了一個預先編譯 Pre compilation 的編譯模型 這個編譯方法會將每個網頁都各自編譯成一個組件 其檔案名稱會是 App 亂數字串 dll 命名 在編譯時期由 ASP NET Pre compilation 工具 aspnet compiler exe 給定 優點是可以不必載入過量的程式碼到記憶體中 但缺點則是無法自訂命名空間 而且在更新時必須要更新所有的 DLL 檔以及網頁等 否則會造成名稱不一致 讓 DLL 無法被載入的問題 早期 ASP NET 2 0 僅提供預先編譯模式 讓它的缺點很快的被暴露出來 因此微軟也為 ASP NET 2 0 開發了沿用 ASP NET 1 x 的編譯模型的工具 Web Application Project 在 Visual Studio 2008 中開始內建 至此 ASP NET 支援兩種編譯模式的架構抵定 安全性支援 编辑ASP NET 的安全性支援分為驗證 Authentication 與授權 Authorization 兩個部份 驗證 编辑 ASP NET 的驗證方式有三種 16 Windows 驗證 由 IIS 目前執行的帳戶 或者是使用者模擬 user impersonate 帳戶的方式進行驗證 表單驗證 由表單的資料提供驗證 開發人員自訂驗證邏輯 並交由 ASP NET 表單驗證工具寫入驗證憑證 以進行授權 Passport 驗證 在 ASP NET 1 x 中 連接Windows Live ID 當時的舊稱為Microsoft Passport 服務以進行驗證 授權 编辑 ASP NET 的授權方式有兩種 17 檔案授權 由 ASP NET 檢查檔案的 存取控制表 ACL 來授權存取權限 URL授權 由開發人員設定的 URL 來給予權限 一個 URL 授權的設定範例如下 lt authorization gt lt allow users Kim gt lt allow roles Admins gt lt deny users John gt lt deny users gt lt authorization gt Web Service支援 编辑ASP NET 1 0 開始支援 Web Service 的開發 是微軟在原生平台上支援 Web Service 發展的第一個實作品 但它卻不是微軟的第一個 Web Service 開發工具實作品 18 NET Framework 中提供了一個 WSDL exe 可以連接 Web Service 下載WSDL定義檔 並產生一個 Proxy Class 的原始碼 供用戶端應用程式使用 若是使用 Visual Studio 開發的話 這個動作會由 加入 Web 參考 的動作在背後處理掉 ASP NET Web Service 的發展只是平台的基礎 微軟在 Web Service 的開發上提供持續的支援 尤其是在 WS I Web Service Interoperability 組織成立後 為符合 WS I 的 Web Service 標準 微軟開發了強化 Web Service 的增強套件 Web Service Enhancement WSE 最新版本為 3 0 版 搭配 ASP NET 2 0 可支援許多 WS I 的標準 由於 Windows Communication Foundation 的推出 微軟將 Web Service 的發展重心移到 WCF 上 原有的 ASP NET Web Service 即給定了一個名稱 ASMX Web Service 擴充功能 编辑ASP NET 在 2 0 版時 功能已大致底定 成為 Web 應用程式的基礎架構 微軟開始在 ASP NET 2 0 上開發擴充的功能 包括 AJAX 的支援 MVC架構的支援以及更容易開發出資料庫應用的架構 ASP NET AJAX 编辑 主条目 ASP NET AJAX ASP NET AJAX 是微軟發展的 AJAX Framework 讓 ASP NET 的開發人員得以用很簡單的方式就可以開發出支援 AJAX AJAX enabled 的應用程式 包含用戶端指令碼的支援 以及伺服器端的連結等等 ASP NET MVC Framework 编辑 主条目 ASP NET MVC Framework ASP NET MVC Framework 是微軟基於 MVC Model View Controller 架構所開發的架構 讓應用程式各個模型可以在 MVC 架構下運行 View 負責顯示資料以及使用者介面 在 ASP NET MVC 架構下 View 可以支援 REST 樣式的 URL Model 負責定義資料的儲存 此部份可以由 LINQ to SQL 與 ADO NET Entity Framework 來代替 Controller 負責處理 View 和 Model 之間的聯繫 ASP NET MVC Framework 也支援以測試驅動的開發模式 Test Driven Development ASP NET Dynamic Data Framework 编辑 主条目 ASP NET Dynamic Data ASP NET Dynamic Data Framework 是微軟在 ASP NET 3 5 中開發的一組類別庫 封裝在 System Web DynamicData 命名空間中 並且配合 ASP NET Routing Model 網頁繞送功能 讓開發人員可以很簡單的開發出基於 LINQ to SQL 或是 ADO NET Entity Framework 資料模型的資料庫應用程式 ASP NET Routing 编辑 主条目 ASP NET Routing ASP NET Routing Model 官方譯名為 ASP NET 路由 是一個基於REST規格下的 URL 對應機制 開發人員可以在伺服器端設定 URL 的格式 使用者可以用由開發人員定義的 URL 格式瀏覽網頁 ASP NET 會自動將 URL 轉換成為內部的 URL 格式 雖然它和 URL Rewriting 很像 但微軟認為 ASP NET Routing 不是 URL Rewriting 19 Silverlight 编辑 主条目 Microsoft Silverlight Silverlight 是微軟的新一代RIA技術 ASP NET 3 5 Service Pack 1 SP1 中加入了對 Silverlight 2 0 的 ASP NET 伺服器端支援 包含 Silverlight控制項 讓伺服器端可以產生支援 Silverlight 的物件標記 以及自訂參數等 Media控制項 讓伺服器端輸出以 Silverlight 為主的串流影音 streaming media 播放器 開發工具 编辑目前已有數個工具可支援 ASP NET 應用程式的開發 Visual Web Developer 2008 Express Edition 免費 或 Visual Studio 2008 ASP NET 2 0 3 5 20 Visual Web Developer 2005 Express Edition 免費 或 Visual Studio 2005 ASP NET 2 0 Visual Studio NET ASP NET 1 x Delphi 2006 Macromedia HomeSite 5 5 For ASP Tags Microsoft Expression Web Microsoft Expression Studio 工具集的一部份 Microsoft SharePoint Designer MonoDevelop 免費 開放原始碼 SharpDevelop 免費 開放原始碼 Eiffel for ASP NET 免費 WebMatrix 3 免費 Adobe Dreamweaver CC 版本 编辑在一台计算机上 查看Windows注册表的 HKEY LOCAL MACHINE SOFTWARE Microsoft NET Framework Setup NDP v4 Full 其Version节点显示的就是所安装的ASP NET的版本号 日期 版本 說明 新功能2002年1月16日 1 0 與Visual Studio NET一起發行的第一個版本 物件導向的Web應用程開發 支援繼承 多型與其他標準物件導向程式設計的功能 開發人員不再需要使用 Server CreateObject 讓早期繫結與型別安全變得可能 以Microsoft Windows程式設計為基礎 開發人員能夠使用在Web Server上使用的DLL類別庫來建立許多能夠做到比只簡單的輸出 HTML 更多的魯棒性 robust 應用程式 例如例外處理功能 2003年4月24日 1 1 與Windows Server 2003和Visual Studio NET 2003一起發表 行動裝置控制項 自動化輸入驗證 2005年11月7日 2 0 研發代號為Whidbey 和Visual Studio 2005 Visual Web Developer Express與SQL Server 2005一起發表 新的資料控制項 GridView FormView DetailsView 新的宣告式資料存取技術 SqlDataSource ObjectDataSource 與 XmlDataSource 控制項 導覽控制項 SiteMap Menu TreeView 主版頁面 Master Page 登入控制項 主題 表皮 skin Web 部件 Web Part 個人化服務 Profile 全功能的預先編譯能力 全新的當地語系化技術 支援64位元平台 提供者類別模式2007年11月19日 3 5 與Visual Studio 2008和Windows Server 2008一起發表 新資料控制項 ListView DataPager ASP NET AJAX 內含到 NET Framework 成為 NET Framework的一部份 提供支援 LINQ 的 LinqDataSource 控制項 2008年8月11日 3 5 Service Pack 1 21 於 Visual Studio 2008 Service Pack 1 發表 內含ASP NET Dynamic Data 在 ASP NET AJAX 應用程式中支援瀏覽器歷史控制 controlling browser history 將多個JavaScript檔案合併到單一檔案以強化有效的下載 2010年4月12日 4 0 與Visual Studio 2010一起發表 配合 NET Framework 4 0讓Web應用程式具有如並列運算函式庫 Parallel Library 等新功能 ASP NET MVC 2 0 jQuery完全整合與ASP NET AJAX Client Library 強化 以及 AJAX CDN 的支援 ASP NET 的 Render Compatibility 3 5以前版本或4 0版 可控制許多 ASP NET Web 控制項的繪製行為 以配合標準 HTML 與 jQuery 的處理 SEO的支援 自訂快取提供者 Extensible Output Cache QueryExtender 的支援 CSS 控制行為的變更 自訂的 Client ID 輸出 ViewState 的控制 配合 Visual Studio 2010 的 Web Deploy 工具 Entity Framework 4 0 的支援 Dynamic Data Framework 與 Chart Control 內建至核心中 2012年8月15日 4 5 與Visual Studio 2012一起發表2013年10月17日 舊版本 不再支援 4 5 1 Visual Studio 2013 22 发布用于Windows Server 2012 R2与Windows 8 1 Bootstrap 3 0 Web API 2 OAuth 2 0 OData改进 CORS MVC 5 Attribute routing authentication filters filter overrides EF 6 SignalR OWIN2014年5月5日 23 舊版本 不再支援 4 5 2 更高可靠性的HTTP header检查与修改方法 新的方式调度背景异步worker任务2015年7月29日 23 舊版本 不再支援 4 6 发布于 24 Visual Studio 2015 25 与EF 7预览版用于Windows Server 2016与Windows 10 HTTP 2支持运行于 Windows 10 更多的异步任务返回API2015年11月30日 23 舊版本 不再支援 4 6 12016年8月2日 23 舊版本 仍被支援 4 6 2 改进的异步支持 输出cache与session providers 2017年4月11日 23 舊版本 仍被支援 4 7 包含在Windows 10 Creators Update 26 操作系统支持TLS协议2017年10月17日 23 當前版本 4 7 1 包含在Windows 10 Fall Creators Update 27 改进可访问性 Value tuple 类型序列化 SHA 2 支持2018年5月1日 28 當前版本 4 7 22019年4月18日 29 當前版本 4 8 包含在 Windows 10 May 2019 Update 修复了ASP NET的10个bugs2015年11月18日 舊版本 不再支援 5 RC1 这一版本后来从ASP NET分开 改称ASP NET Core 1 0 30 一个全新项目有不同的开发原则与目标 格式 舊版本舊版本 仍被支援当前版本最新的预览版未来版本參見 编辑 nbsp 微软主题 ASP NET Core NET Framework Visual Studio Microsoft Silverlight ASP ADO NET Web Service PHP JSP參考資料 编辑 Release 3 3 0 2023年10月24日 2023年11月18日 MONO Project 2009 01 18 原始内容存档于2010 05 27 Architecture Journal Profile Scott Guthrie 2009 01 18 原始内容存档于2009 01 12 若是 IIS 5 x 時 則是轉交給網站的執行緒 IIS 6 0 以後的版本才有 Worker Process 的工作模型 ASP NET Page Lifecycle Overview 2009 01 18 原始内容存档于2009 01 18 工作階段狀態模式 2009 01 18 原始内容存档于2009 03 12 ASP NET 網站巡覽 2009 01 18 原始内容存档于2009 06 25 使用成員資格管理使用者 2009 01 18 原始内容存档于2008 12 25 使用角色管理授權 2009 01 18 原始内容存档于2008 12 25 ASP NET 設定檔屬性概觀 2009 01 18 原始内容存档于2009 06 25 Web 組件個人化概觀 2009 01 18 原始内容存档于2009 06 24 ASP NET 健康監視事件概觀 2009 01 18 原始内容存档于2008 12 25 HTTP 處理常式和 HTTP 模組概觀 2009 01 18 原始内容存档于2009 02 28 ASP NET 主版頁面 2009 01 18 原始内容存档于2009 06 24 ASP NET 佈景主題和面板概觀 2009 01 18 原始内容存档于2008 12 25 ASP NET 驗證 2009 01 18 原始内容存档于2009 06 24 ASP NET 授權 2009 01 18 原始内容存档于2009 06 25 早期還有一個在 ASP 上發展 Web Service 的工具 稱為 SOAP Toolkit ASP NET 路由 2009 01 18 原始内容存档于2009 01 23 VS Express FAQ 2009 01 18 原始内容存档于2009 01 23 ASP NET in NET 3 5 Service Pack 1 Microsoft 2009 01 18 原始内容存档于2009 01 21 Announcing release of ASP NET and Web Tools for Visual Studio 2013 2018 10 16 原始内容存档于2015 12 08 23 0 23 1 23 2 23 3 23 4 23 5 net framework product lifecycle 2018 10 16 原始内容存档于2018 10 16 Announcing NET Framework 4 6 2018 10 16 原始内容存档于2015 07 20 Visual Studio 2015 and Visual Studio 2013 Update 5 Released msdn com Microsoft 2018 10 16 原始内容存档于2015 09 04 Announcing the NET Framework 4 7 2018 10 16 原始内容存档于2018 07 10 Announcing the NET Framework 4 7 1 2018 12 21 原始内容存档于2017 12 31 Microsoft NET Framework 4 7 2 正式版发布 2018年05月01日 cnBeta COM 2019年5月14日 原始内容存档于2019年5月14日 Announcing the NET Framework 4 8 2019 05 15 原始内容存档于2019 04 19 Releases GitHub 2018 10 16 原始内容存档于2018 04 10 外部連結 编辑 繁體中文 ASP NET Overview 页面存档备份 存于互联网档案馆 英文 ASP NET Official Site 页面存档备份 存于互联网档案馆 英文 ASP NET Developer Center on MSDN 页面存档备份 存于互联网档案馆 英文 ASP NET Web Blogs 页面存档备份 存于互联网档案馆 取自 https zh wikipedia org w index php title ASP NET amp oldid 76776275, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。