C# Webconfig全解析
阿新 • • 發佈:2020-06-17
- 一、認識Web.config檔案
- Web.config檔案是一個xml文字檔案,它用來儲存asp.NETWeb應用程式的配置資訊(如最常用的設定asp.NETWeb應用程式的身份驗證方式),它可以出現在應用程式的每一個目錄中。當你通過.NET新建一個Web應用程式後,預設情況下會在根目錄自動建立一個預設的Web.config檔案,包括預設的配置設定,所有的子目錄都繼承它的配置設定。如果你想修改子目錄的配置設定,你可以在該子目錄下新建一個Web.config檔案。它可以提供除從父目錄繼承的配置資訊以外的配置資訊,也可以重寫或修改父目錄中定義的設定。
- (一).Web.Config是以xml檔案規範儲存,配置檔案分為以下格式
- 1.配置節處理程式宣告
- 特點:位於配置檔案的頂部,包含在<configSections>標誌中。
- 2.特定應用程式配置
- 特點:位於<appSetting>中。可以定義應用程式的全域性常量設定等資訊.
- 3.配置節設定
- 特點:位於<system.Web>節中,控制asp.net執行時的行為.
- 4.配置節組
- 特點:用<sectionGroup>標記,可以自定義分組,可以放到<configSections>內部或其它<sectionGroup>標記的內部.
- (二).配置節的每一節
- 1.<configuration>節根元素,其它節都是在它的內部.
- 2.<appSetting>節此節用於定義應用程式設定項。對一些不確定設定,還可以讓使用者根據自己實際情況自己設定
- 用法:
- I.<appSettings>
- <addkey="Conntction"value="server=192.168.85.66;userid=sa;password=;database=Info;"/>
- <appSettings>
- 定義了一個連線字串常量,並且在實際應用時可以修改連線字串,不用修改程式程式碼.
- II.<appSettings>
- <addkey="ErrPage"value="Error.aspx"/><appSettings>定義了一個錯誤重定向頁面.
- 3.<compilation>節
- 格式:
- <compilation
- defaultLanguage="c#"
- debug="true"
- />
- I.defaultlanguage:定義後臺程式碼語言,可以選擇c#和vb.net兩種語言.
- IIdebug:為true時,啟動aspx除錯;為false不啟動aspx除錯,因而可以提高應用程式執行時的效能。一般程式設計師在開發時設定為true,交給客戶時設定為false.
- 4.<customErrors>節
- 格式:
- <customErrors
- mode="RemoteOnly"
- defaultRedirect="error.aspx"
- <errorstatusCode="440"redirect="err440page.aspx"/>
- <errorstatusCode="500"redirect="err500Page.aspx"/>
- />
- I.mode:具有On,Off,RemoteOnly3種狀態。On表示始終顯示自定義的資訊;Off表示始終顯示詳細的asp.net錯誤資訊;RemoteOnly表示只對不在本地Web伺服器上執行的使用者顯示自定義資訊.
- II.defaultRedirect:用於出現錯誤時重定向的URL地址.是可選的
- III.statusCode:指明錯誤狀態碼,表明一種特定的出錯狀態.
- IV.redirect:錯誤重定向的URL.
- 5.<globalization>節
- 格式:
- <globalization
- requestEncoding="utf-8"
- responseEncoding="utf-8"
- fileEncoding="utf-8"
- />
- I.requestEncoding:它用來檢查每一個發來請求的編碼.
- II.responseEncoding:用於檢查發回的響應內容編碼.
- III.fileEncoding:用於檢查aspx,asax等檔案解析的預設編碼.
- 6.<sessionState>節
- 格式:
- <sessionState
- mode="InProc"
- stateConnectionString="tcpip=127.0.0.1:42424"
- sqlConnectionString="datasource=127.0.0.1;Trusted_Connection=yes"
- cookieless="false"
- timeout="20"
- />
- I.mode:分為off,Inproc,StateServer,SqlServer幾種狀態
- mode=InProc儲存在程序中特點:具有最佳的效能,速度最快,但不能跨多臺伺服器儲存共享.mode="StateServer"儲存在狀態伺服器中特點:當需要跨伺服器維護使用者會話資訊時,使用此方法。但是資訊儲存在狀態伺服器上,一旦狀態伺服器出現故障,資訊將丟失.mode="SqlServer"儲存在sqlserver中特點:工作負載會變大,但資訊不會丟失.
- II.stateConnectionString:指定asp.net應用程式儲存遠端會話狀態的伺服器名,預設為本機
- III.sqlConnectionString:當用會話狀態資料庫時,在這裡設定連線字串
- IV.Cookieless:設定為true時,表示不使用cookie會話狀態來標識客戶;否則,相反.
- V.TimeOut:用來定義會話狀態儲存的時間,超過期限,將自動終止會話.
- 7.<authentication>節
- 格式:
- <authenticationmode="Forms">
- <formsname=".ASPXUSERDEMO"loginUrl="Login.aspx"protection="All"timeout="30"/>
- </authentication>
- <authorization>
- <denyusers="?"/>
- </authorization>
- I.Windows:使用IIS驗證方式
- II.Forms:使用基於窗體的驗證方式
- III.Passport:採用Passportcookie驗證模式
- IV.None:不採用任何驗證方式
- 裡面內嵌Forms節點的屬性涵義:
- I.Name:指定完成身份驗證的Httpcookie的名稱.
- II.LoginUrl:如果未通過驗證或超時後重定向的頁面URL,一般為登入頁面,讓使用者重新登入
- III.Protection:指定cookie資料的保護方式.
- 可設定為:AllNoneEncryptionValidation四種保護方式
- a.All表示加密資料,並進行有效性驗證兩種方式
- b.None表示不保護Cookie.
- c.Encryption表示對Cookie內容進行加密
- d.validation表示對Cookie內容進行有效性驗證
- IV.TimeOut:指定Cookie的失效時間.超時後要重新登入.
- 在執行時對Web.config檔案的修改不需要重啟服務就可以生效(注:<processModel>節例外)。當然Web.config檔案是可以擴充套件的。你可以自定義新配置引數並編寫配置節處理程式以對它們進行處理。
- web.config配置檔案(預設的配置設定)以下所有的程式碼都應該位於
- <configuration>
- <system.web>
- 和
- </system.web>
- </configuration>
- 之間,出於學習的目的下面的示例都省略了這段xml標記。
- 1、<authentication>節
- 作用:配置asp.NET身份驗證支援(為Windows、Forms、PassPort、None四種)。該元素只能在計算機、站點或應用程式級別宣告。<authentication>元素必需與<authorization>節配合使用。
- 示例:
- 以下示例為基於窗體(Forms)的身份驗證配置站點,當沒有登陸的使用者訪問需要身份驗證的網頁,網頁自動跳轉到登陸網頁。
- <authenticationmode="Forms">
- <formsloginUrl="logon.aspx"name=".FormsAuthCookie"/>
- </authentication>
- 其中元素loginUrl表示登陸網頁的名稱,name表示Cookie名稱。
- 2、<authorization>節
- 作用:控制對URL資源的客戶端訪問(如允許匿名使用者訪問)。此元素可以在任何級別(計算機、站點、應用程式、子目錄或頁)上宣告。必需與<authentication>節配合使用。
- 示例:以下示例禁止匿名使用者的訪問
- <authorization>
- <denyusers="?"/>
- </authorization>
- 注:你可以使用user.identity.name來獲取已經過驗證的當前的使用者名稱;可以使用web.Security.FormsAuthentication.RedirectFromLoginPage方法將已驗證的使用者重定向到使用者剛才請求的頁面.具體的
- 3、<compilation>節
- 作用:配置asp.NET使用的所有編譯設定。預設的debug屬性為“True”.在程式編譯完成交付使用之後應將其設為False(Web.config檔案中有詳細說明,此處省略示例)
- 4、<customErrors>
- 作用:為asp.NET應用程式提供有關自定義錯誤資訊的資訊。它不適用於xmlWebservices中發生的錯誤。
- 示例:當發生錯誤時,將網頁跳轉到自定義的錯誤頁面。
- <customErrorsdefaultRedirect="ErrorPage.aspx"mode="RemoteOnly">
- </customErrors>
- 其中元素defaultRedirect表示自定義的錯誤網頁的名稱。mode元素表示:對不在本地Web伺服器上執行的使用者顯示自定義(友好的)資訊。
- 5、<httpRuntime>節
- 作用:配置asp.NETHTTP執行庫設定。該節可以在計算機、站點、應用程式和子目錄級別宣告。
- 示例:控制使用者上傳檔案最大為4M,最長時間為60秒,最多請求數為100
- <httpRuntimemaxRequestLength="4096"executionTimeout="60"appRequestQueueLimit="100"/>
- 6、<pages>
- 作用:標識特定於頁的配置設定(如是否啟用會話狀態、檢視狀態,是否檢測使用者的輸入等)。<pages>可以在計算機、站點、應用程式和子目錄級別宣告。
- 示例:不檢測使用者在瀏覽器輸入的內容中是否存在潛在的危險資料(注:該項預設是檢測,如果你使用了不檢測,一要對使用者的輸入進行編碼或驗證),在從客戶端回發頁時將檢查加密的檢視狀態,以驗證檢視狀態是否已在客戶端被篡改。(注:該項預設是不驗證)
- <pagesbuffer="true"enableViewStateMac="true"validateRequest="false"/>
- 7、<sessionState>
- 作用:為當前應用程式配置會話狀態設定(如設定是否啟用會話狀態,會話狀態儲存位置)。
- 示例:
- <sessionStatemode="InProc"cookieless="true"timeout="20"/>
- </sessionState>
- 注:
- mode="InProc"表示:在本地儲存會話狀態(你也可以選擇儲存在遠端伺服器或SAL伺服器中或不啟用會話狀態)
- cookieless="true"表示:如果使用者瀏覽器不支援Cookie時啟用會話狀態(預設為False)
- timeout="20"表示:會話可以處於空閒狀態的分鐘數
- 8、<trace>
- 作用:配置asp.NET跟蹤服務,主要用來程式測試判斷哪裡出錯。
- 示例:以下為Web.config中的預設配置:
- <traceenabled="false"requestLimit="10"pageOutput="false"traceMode="SortByTime"localOnly="true"/>
- 注:
- enabled="false"表示不啟用跟蹤;
- requestLimit="10"表示指定在伺服器上儲存的跟蹤請求的數目
- pageOutput="false"表示只能通過跟蹤實用工具訪問跟蹤輸出;
- traceMode="SortByTime"表示以處理跟蹤的順序來顯示跟蹤資訊
- localOnly="true"表示跟蹤檢視器(trace.axd)只用於宿主Web伺服器
- 自定義Web.config檔案配置
- 自定義Web.config檔案配置節過程分為兩步。
- 1.在配置檔案頂部<configSections>和</configSections>標記之間宣告配置節的名稱和處理該節中配置資料的.NETFramework類的名稱。
- 2.是在<configSections>區域之後為宣告的節做實際的配置設定。
- 示例:建立一個節儲存資料庫連線字串
- <configuration>
- <configSections>
- <sectionname="appSettings"type="System.Configuration.NameValueFileSectionHandler,System,Version=1.0.3300.0,Culture=neutral,PublicKeyToken=b77a5c561934e089"/>
- </configSections>
- <appSettings>
- <addkey="scon"value="server=a;database=northwind;uid=sa;pwd=123"/>
- </appSettings>
- <system.web>
- ......
- </system.web>
- </configuration>
- 訪問Web.config檔案你可以通過使用ConfigurationSettings.AppSettings靜態字串集合來訪問Web.config檔案示例:獲取上面例子中建立的連線字串。例如:
- protectedstaticstringIsdebug=ConfigurationSettings.AppSettings["debug"]
- 二、web.config中的session配置詳解
- 開啟某個應用程式的配置檔案Web.config後,我們會發現以下這段:
- <sessionState
- mode="InProc"
- stateConnectionString="tcpip=127.0.0.1:42424"
- sqlConnectionString="datasource=127.0.0.1;Trusted_Connection=yes"
- cookieless="false"
- timeout="20"
- />
- 這一段就是配置應用程式是如何儲存session資訊的了。我們以下的各種操作主要是針對這一段配置展開。讓我們先看看這一段配置中所包含的內容的意思。sessionState節點的語法是這樣的:
- <sessionStatemode="Off|InProc|StateServer|SQLServer"
- cookieless="true|false"
- timeout="numberofminutes"
- stateConnectionString="tcpip=server:port"
- sqlConnectionString="sqlconnectionstring"
- stateNetworkTimeout="numberofseconds"
- />
- 必須有的屬性是:屬性選項描述
- mode設定將session資訊儲存到哪裡
- ØOff設定為不使用session功能,
- ØInProc設定為將session儲存在程序內,就是asp中的儲存方式,這是預設值,
- ØStateServer設定為將session儲存在獨立的狀態服務中,
- ØSQLServer設定將session儲存在sqlserver中。
- 可選的屬性是:屬性選項描述
- Øcookieless設定客戶端的session資訊儲存到哪裡,
- Øture使用Cookieless模式,
- Øfalse使用Cookie模式,這是預設值,
- Øtimeout設定經過多少分鐘後伺服器自動放棄session資訊,預設為20分鐘。
- stateConnectionString設定將session資訊儲存在狀態服務中時使用的伺服器名稱和埠號,例如:"tcpip=127.0.0.1:42424”。當mode的值是StateServer是,這個屬性是必需的。
- sqlConnectionString設定與sqlserver連線時的連線字串。例如"datasource=localhost;IntegratedSecurity=SSPI;InitialCatalog=northwind"。當mode的值是SQLServer時,這個屬性是必需的。
- stateNetworkTimeout設定當使用StateServer模式儲存session狀態時,經過多少秒空閒後,斷開Web伺服器與儲存狀態資訊的伺服器的tcp/IP連線的。預設值是10秒鐘。
- asp.NET中客戶端session狀態的儲存
- 在我們上面的session模型簡介中,大家可以發現session狀態應該儲存在兩個地方,分別是客戶端和伺服器端。客戶端只負責儲存相應網站的SessionID,而其他的session資訊則儲存在伺服器端。在asp中,客戶端的SessionID實際是以Cookie的形式儲存的。如果使用者在瀏覽器的設定中選擇了禁用Cookie,那末他也就無法享受session的便利之處了,甚至造成不能訪問某些網站。為了解決以上問題,在asp.NET中客戶端的session資訊儲存方式分為:Cookie和Cookieless兩種。
- asp.NET中,預設狀態下,在客戶端還是使用Cookie儲存session資訊的。如果我們想在客戶端使用Cookieless的方式儲存session資訊的方法如下:
- 找到當前Web應用程式的根目錄,開啟Web.Config檔案,找到如下段落:
- <sessionState
- mode="InProc"
- stateConnectionString="tcpip=127.0.0.1:42424"
- sqlConnectionString="datasource=127.0.0.1;Trusted_Connection=yes"
- cookieless="false"
- timeout="20"
- />
- 這段話中的cookieless="false"改為:cookieless="true",這樣,客戶端的session資訊就不再使用Cookie儲存了,而是將其通過URL儲存。關閉當前的IE,開啟一個新IE,重新訪問剛才的Web應用程式,就會看到類似下面的樣子:
- 其中,http://localhost/MyTestApplication/(ulqsek45heu3ic2a5zgdl245)/default.aspx中黑體標出的就是客戶端的sessionID。注意,這段資訊是由IIS自動加上的,不會影響以前正常的連線。
- asp.NET中伺服器端session狀態的儲存準備工作:
- 為了您能更好的體驗到實驗現象,您可以建立一個叫做SessionState.aspx的頁面,然後把以下這些程式碼新增到<body></body>中。
- <scriptrunat="server">
- SubSession_Add(senderAsObject,eAsEventArgs)
- session("MySession")=text1.Value
- span1.InnerHtml="Sessiondataupdated!<P>Yoursessioncontains:<fontcolor=red>"&session("MySession").ToString()&"</font>"
- EndSub
- SubCheckSession(senderAsObject,eAsEventArgs)
- If(Session("MySession")IsNothing)Then
- span1.InnerHtml="NOTHING,sessionDATALOST!"
- Else
- span1.InnerHtml="Yoursessioncontains:<fontcolor=red>"&session("MySession").ToString()&"</font>"
- EndIf
- EndSub
- </script>
- <formrunat="server"id="Form2">
- <inputid="text1"type="text"runat="server"name="text1">
- <inputtype="submit"runat="server"OnServerClick="Session_Add"
- value="AddtosessionState"id="Submit1"name="Submit1">
- <inputtype="submit"runat="server"OnServerClick="CheckSession"
- value="ViewsessionState"id="Submit2"name="Submit2">
- </form>
- <hrsize="1">
- <fontsize="6"><spanid="span1"runat="server"/></font>
- 這個SessionState.aspx的頁面可以用來測試在當前的伺服器上是否丟失了session資訊。
- 將伺服器session資訊儲存在程序中
- 讓我們來回到Web.config檔案的剛才那段段落中:
- <sessionState
- mode="InProc"
- stateConnectionString="tcpip=127.0.0.1:42424"
- sqlConnectionString="datasource=127.0.0.1;Trusted_Connection=yes"
- cookieless="false"
- timeout="20"
- />
- 當mode的值是InProc時,說明伺服器正在使用這種模式。
- 這種方式和以前asp中的模式一樣,就是伺服器將session資訊儲存在IIS程序中。當IIS關閉、重起後,這些資訊都會丟失。但是這種模式也有自己最大好處,就是效能最高。應為所有的session資訊都儲存在了IIS的程序中,所以IIS能夠很快的訪問到這些資訊,這種模式的效能比程序外儲存session資訊或是在sqlserver中儲存session資訊都要快上很多。這種模式也是asp.NET的預設方式。
- 好了,現在讓我們做個試驗。開啟剛才的SessionState.aspx頁面,隨便輸入一些字元,使其儲存在session中。然後,讓我們讓IIS重起。注意,並不是使當前的站點停止再開始,而是在IIS中本機的機器名的節點上點選滑鼠右鍵,選擇重新啟動IIS。(想當初使用NT4時,重新啟動IIS必須要重新啟動計算機才行,微軟真是@#$%^&)返回到SessionState.aspx頁面中,檢查剛才的session資訊,發現資訊已經丟失了。
- 將伺服器session資訊儲存在程序外
- 首先,讓我們來開啟管理工具->服務,找到名為:asp.NETStateService的服務,啟動它。實際上,這個服務就是啟動一個要儲存session資訊的程序。啟動這個服務後,你可以從Windows工作管理員->程序中看到一個名為aspnet_state.exe的程序,這個就是我們儲存session資訊的程序。
- 然後,回到Web.config檔案中上述的段落中,將mode的值改為StateServer。儲存檔案後的重新開啟一個IE,開啟SessionState.aspx頁面,儲存一些資訊到session中。這時,讓我們重起IIS,再回到SessionState.aspx頁面中檢視剛才的session資訊,發現沒有丟失。
- 實際上,這種將session資訊儲存在程序外的方式不光指可以將資訊儲存在本機的程序外,還可以將session資訊儲存在其他的伺服器的程序中。這時,不光需要將mode的值改為StateServer,還需要在stateConnectionString中配置相應的引數。例如你的計算你是192.168.0.1,你想把session儲存在ip為192.168.0.2的計算機的程序中,就需要設定成這樣:stateConnectionString="tcpip=192.168.0.2:42424"。當然,不要忘記在192.168.0.2的計算機中裝上.NETFramework,並且啟動asp.NETStateServices服務。
- 將伺服器session資訊儲存在sqlserver中
- 首先,還是讓我們來做一些準備工作。啟動sqlserver和sqlserver代理服務。在sqlserver中執行一個叫做InstallSqlState.sql的指令碼檔案。這個指令碼檔案將在sqlserver中建立一個用來專門儲存session資訊的資料庫,及一個維護session資訊資料庫的sqlserver代理作業。我們可以在以下路徑中找到那個檔案:
- [systemdrive]/winnt/Microsoft.NET/Framework/[version]/
- 然後開啟查詢分析器,連線到sqlserver伺服器,開啟剛才的那個檔案並且執行。稍等片刻,資料庫及作業就建立好了。這時,你可以開啟企業管理器,看到新增了一個叫ASPState的資料庫。但是這個資料庫中只是些儲存過程,沒有使用者表。實際上session資訊是儲存在了tempdb資料庫的ASPStateTempSessions表中的,另外一個ASPStateTempApplications表儲存了asp中application物件資訊。這兩個表也是剛才的那個指令碼建立的。另外檢視管理->SQLserver代理->作業,發現也多了一個叫做ASPState_Job_DeleteExpiredSessions的作業,這個作業實際上就是每分鐘去ASPStateTempSessions表中刪除過期的session資訊的。
- 接著,我們返回到Web.config檔案,修改mode的值改為SQLServer。注意,還要同時修改sqlConnectionString的值,格式為:
- sqlConnectionString="datasource=localhost;IntegratedSecurity=SSPI;"
- 其中datasource是指sqlserver伺服器的ip地址,如果sqlserver與IIS是一臺機子,寫127.0.0.1就行了。IntegratedSecurity=SSPI的意思是使用Windows整合身份驗證,這樣,訪問資料庫將以asp.NET的身份進行,通過如此配置,能夠獲得比使用userid=sa;password=口令的sqlserver驗證方式更好的安全性。當然,如果sqlserver運行於另一臺計算機上,你可能會需要通過ActiveDirectory域的方式來維護兩邊驗證的一致性。
- 同樣,讓我們做個試驗。向SessionState.aspx中新增session資訊,這時發現session資訊已經存在sqlserver中了,即使你重起計算機,剛才的session資訊也不會丟失。現在,你已經完全看見了session資訊到底是什麼樣子的了,而且又是儲存在sqlserver中的,能幹什麼就看你的發揮了。
- 總結
- 三、asp.net關於form認證的一般設定
- asp.net關於form認證的一般設定:
- 1:在web.config中,加入form認證;
- <authenticationmode="Forms">
- <formsname="auth"loginUrl="index.aspx"timeout="30"></forms>
- </authentication>
- <authorization>
- <denyusers="?"/>
- </authorization>
- 2:如果有註冊頁面時還應該允許匿名使用者呼叫註冊頁面進行註冊;
- 以下程式碼應該在<configuration><system.web>之間,而不應該包含到<system.web>..</system.web>之間;
- ----------------表示允許匿名使用者對userReg.aspx頁面進行訪問.
- <locationpath="userReg.aspx">
- <system.web>
- <authorization>
- <allowusers="?"/>
- </authorization>
- </system.web>
- </location>
- 3在登入成功後要建立身份驗證票,表明已經通過認證的合法使用者;
- if(登陸成功)
- System.Web.Security.FormsAuthentication.SetAuthCookie(使用者名稱稱,false);
- 四、訪問Web.config檔案
- 你可以通過使用ConfigurationSettings.AppSettings靜態字串集合來訪問Web.config檔案示例:獲取上面例子中建立的連線字串。例如:
- protectedstaticstringIsdebug=ConfigurationSettings.AppSettings["scon"]
- asp.Net效能優化.
- (一).選擇會話狀態儲存方式
- 在Webconfig檔案配置:
- <sessionStatemode="???"stateConnectionString="tcpip=127.0.0.1:42424"
- sqlConnectionString="datasource=127.0.0.1;Trusted_Connection=yes"
- cookieless="false"timeout="20"/>
- asp.net有三種方式儲存會話狀態資訊:
- 1.儲存在程序中:屬性mode=InProc
- 特點:具有最佳的效能,速度最快,但不能跨多臺伺服器儲存共享.
- 2.儲存在狀態伺服器中:屬性mode="StateServer"
- 特點:當需要跨伺服器維護使用者會話資訊時,使用此方法。
- 但是資訊儲存在狀態伺服器上,一旦狀態伺服器出現故障,資訊將丟失
- 3.儲存在sqlserver中:屬性mode="SqlServer"
- 特點:工作負載會變大,但資訊不會丟失.
- 補充一點:
- I.由於某些頁面不需要會話狀態,則可以將會話狀態禁用:
- 程式碼如下:<%@PageEnableSessionState="false"%>
- II.如果頁面需要訪問會話變數但不允許修改它們,可以設定頁面會話狀態為只讀:
- 程式碼如下:<%@PageEnableSessionState="false"%>
- 使用時可以根據具體情況選擇某種方式
- (二).使用Page.IsPostBack
- Page.IsPostBack表示是否是從客戶端返回的.初次執行時,不是從客戶端返回,它的值
- 為false,當觸發頁面上的事件或重新整理頁面時,Page.IsPostBack由於是回發的,值變為true;
- 一般在:Page_Load方法中用:
- privatevoidPage_Load(Objectsender,EventArgse)
- {
- if(!Page.IsPostBack)
- {
- ....;//初始化頁面的程式碼。這些程式碼第一次頁面初始化時執行,當第二次回發時,
- //不會再執行。提高效率。
- }
- }
- 往往很多時候不得不用IsPostBack,因為有些控制元件初始化後,要保持它的狀態.
- 例如:DropDownList,如果每次都初始化,則使用者無論選擇其選項,都會被初始化為預設值.
- (三).避免使用伺服器控制元件
- 1.一般的靜態顯示資訊,儘量不要用服務端控制元件顯示.因為服務端控制元件需要回發服務端執行,
- 會降低程式執行效率,一般用<DIV>顯示即可.
- 如果用了服務端控制元件,將:runat="server"去掉,也會提高效率.
- 2.禁用服務端控制元件的狀態檢視,有些控制元件不需要維護其狀態,可以設定其屬性:EnableViewState=false;
- 如果整個頁面控制元件都不需要維持狀態檢視,則可以設定整個頁面的狀態視力為false:
- 程式碼如下:<%@PageEnableViewState="false"%>
- 3.在Web.Config檔案中配置:
- asp.NETSessionss可以在Web.config或Machine.config中的Sessionsstate元素中配置。
- 下面是在Web.config中的設定的例子:
- <Sessionsstatetimeout="10"cookieless="false"mode="Inproc"/>
- (四).避免使用DataGrid
- 大家都知道DataGrid功能強大。但是功能強大的同時,增加了效能上的開銷。一般用其它控制元件:DataList
- 或Repeater控制元件能實現的,儘量不用DataGrid.
- (五).字串操作
- 1.避免裝箱操作.裝箱操作執行效率比較低.
- 例如執行兩個程式碼段:
- stringtest="";
- for(forinti=0;i<10000;i++)
- {
- test=test+i;
- }
- 和
- stringtest="";
- for(forinti=0;i<10000;i++)
- {
- test=test+i.ToString();
- }
- 下面的程式碼段顯然效率要高.因為i是整型的,系統要先把i進行裝箱轉換為string型的,再進行連線.需要時間
- 讀者可以Copy到自己機器上測試一下.
- 2.使用StringBulider類
- 在進行字串連線時:stringstr=str1+str2+....;
- 一般超過三項連線,最好用StringBuilder來代替string類.StringBuilder可以避免重新建立string物件造成
- 的效能損失.
- 一般用於組裝sql語句時用到:StringBulider.
- 讀者可以到自己機器上測試一下.
- 3.儘量少用:
- try
- {}
- catch
- {}
- finally
- {}
- 語句.此語句執行效率比較低.
- (六).ADO.Net使用方面優化
- 1.資料庫連線開啟和關閉。在需要連線時開啟,當訪問完資料庫要立刻關閉連線.
- 舉例說明,還是看兩個程式碼段:
- I.
- DataSetds=newDataSet();
- SqlConnectionMyConnection=newSqlConnection("server=localhost;uid=sa;pwd=;database=NorthWind");
- SqlCommandmyCommand=newSqlCommand(strSql,MyConnection);
- SqlDataAdaptermyAdapter=newSqlDataAdapter(queryStr,connectionStr);
- MyConnection.Open();//開啟連線
- for(inti=0;i<1000;i++)//for迴圈模擬取得資料前的商業邏輯操作
- {
- Thread.Sleep(1000);
- }
- myAdapter.Fill(ds);
- for(inti=0;i<1000;i++)//for迴圈模擬取得資料後的商業邏輯操作
- {
- Thread.Sleep(1000);
- }
- MyConnection.Close();//關閉連線
- II.
- DataSetds=newDataSet();
- SqlConnectionMyConnection=newSqlConnection("server=localhost;uid=sa;pwd=;database=NorthWind");
- SqlCommandmyCommand=newSqlCommand(strSql,connectionStr);
- for(inti=0;i<1000;i++)//for迴圈模擬取得資料前的商業邏輯操作
- {
- Thread.Sleep(1000);
- }
- MyConnection.Open();//開啟連線
- myAdapter.Fill(ds);
- MyConnection.Close();//關閉連線
- for(inti=0;i<1000;i++)////for迴圈模擬取得資料後的商業邏輯操作
- {
- Thread.Sleep(1000);
- }
- 顯示II程式碼比I程式碼好的多,I中早早佔著連線不放,如果使用者很多的話,容易出現連線池滿情況。嚴重時出現宕機現象.
- 2.資料庫查詢
- I.直接生成sql語句。sqlserver每次都要對其進行編譯,在效能方面不會有很大的提高。另外也不夠安全。容易被攻擊.
- II.使用帶引數的sql命令。這種方式sqlserver只對其編譯一次,對於不同的引數可以重複使用編譯後的命令。提高了效能.
- III.使用sqlserver儲存過程.編譯一次.具有獨立性,便於修改和維護.一次能完成用語句傳送多次的功能.減少了網路的
- 流量。並不一定儲存過程一定比語句效率要高,如果商業邏輯很複雜的話,有時候用語句比儲存過程效率要高.
- (七).快取優化
- 快取分為兩種:頁面快取和API快取.
- 1.使用頁面快取和片段快取
- <%@OutputCacheDuration="5"VaryByParam="None"%>
- <%@OutputCacheDuration=60VaryByParam=”TextBox1,TextBox2”%>
- 說明:Duration是設定Cache的過期時間;
- VarByParam是設定是否根據引數而變化,None時所有引數使用同一Cache,
- 設定TextBox1時則根據TextBox1的不同值分別快取;當有多個引數時則要組合快取;
- 2.API快取。用於在應用程式中使用
- I.一個Cache使用的例子:
- http://blog.csdn.net/chengking/archive/2005/10/03/494545.aspx
- II.使用時注意Page.Cache和HttpContext.Current.Cache區別:
- 它們指的同一個物件,在Page裡,用Page.Cache,如果在global.asax或自己的類裡用:HttpContext.Current.Cache在有些事件中,由於其沒有HttpContext,就用HttpRuntime.Cache.
轉載:https://www.cnblogs.com/flyinghigher/archive/2012/03/15/2398669.html