1. 程式人生 > WINDOWS開發 >C# Webconfig全解析

C# Webconfig全解析

  1. 一、認識Web.config檔案
  2. Web.config檔案是一個xml文字檔案,它用來儲存asp.NETWeb應用程式的配置資訊(如最常用的設定asp.NETWeb應用程式的身份驗證方式),它可以出現在應用程式的每一個目錄中。當你通過.NET新建一個Web應用程式後,預設情況下會在根目錄自動建立一個預設的Web.config檔案,包括預設的配置設定,所有的子目錄都繼承它的配置設定。如果你想修改子目錄的配置設定,你可以在該子目錄下新建一個Web.config檔案。它可以提供除從父目錄繼承的配置資訊以外的配置資訊,也可以重寫或修改父目錄中定義的設定。
  3. (一).Web.Config是以xml檔案規範儲存,配置檔案分為以下格式
  4. 1.配置節處理程式宣告
  5. 特點:位於配置檔案的頂部,包含在<configSections>標誌中。
  6. 2.特定應用程式配置
  7. 特點:位於<appSetting>中。可以定義應用程式的全域性常量設定等資訊.
  8. 3.配置節設定
  9. 特點:位於<system.Web>節中,控制asp.net執行時的行為.
  10. 4.配置節組
  11. 特點:用<sectionGroup>標記,可以自定義分組,可以放到<configSections>內部或其它<sectionGroup>標記的內部.
  12. (二).配置節的每一節
  13. 1.<configuration>節根元素,其它節都是在它的內部.
  14. 2.<appSetting>節此節用於定義應用程式設定項。對一些不確定設定,還可以讓使用者根據自己實際情況自己設定
  15. 用法:
  16. I.<appSettings>
  17. <addkey="Conntction"value="server=192.168.85.66;userid=sa;password=;database=Info;"/>
  18. <appSettings>
  19. 定義了一個連線字串常量,並且在實際應用時可以修改連線字串,不用修改程式程式碼.
  20. II.<appSettings>
  21. <addkey="ErrPage"value="Error.aspx"/><appSettings>定義了一個錯誤重定向頁面.
  22. 3.<compilation>節
  23. 格式:
  24. <compilation
  25. defaultLanguage="c#"
  26. debug="true"
  27. />
  28. I.defaultlanguage:定義後臺程式碼語言,可以選擇c#和vb.net兩種語言.
  29. IIdebug:為true時,啟動aspx除錯;為false不啟動aspx除錯,因而可以提高應用程式執行時的效能。一般程式設計師在開發時設定為true,交給客戶時設定為false.
  30. 4.<customErrors>節
  31. 格式:
  32. <customErrors
  33. mode="RemoteOnly"
  34. defaultRedirect="error.aspx"
  35. <errorstatusCode="440"redirect="err440page.aspx"/>
  36. <errorstatusCode="500"redirect="err500Page.aspx"/>
  37. />
  38. I.mode:具有On,Off,RemoteOnly3種狀態。On表示始終顯示自定義的資訊;Off表示始終顯示詳細的asp.net錯誤資訊;RemoteOnly表示只對不在本地Web伺服器上執行的使用者顯示自定義資訊.
  39. II.defaultRedirect:用於出現錯誤時重定向的URL地址.是可選的
  40. III.statusCode:指明錯誤狀態碼,表明一種特定的出錯狀態.
  41. IV.redirect:錯誤重定向的URL.
  42. 5.<globalization>節
  43. 格式:
  44. <globalization
  45. requestEncoding="utf-8"
  46. responseEncoding="utf-8"
  47. fileEncoding="utf-8"
  48. />
  49. I.requestEncoding:它用來檢查每一個發來請求的編碼.
  50. II.responseEncoding:用於檢查發回的響應內容編碼.
  51. III.fileEncoding:用於檢查aspx,asax等檔案解析的預設編碼.
  52. 6.<sessionState>節
  53. 格式:
  54. <sessionState
  55. mode="InProc"
  56. stateConnectionString="tcpip=127.0.0.1:42424"
  57. sqlConnectionString="datasource=127.0.0.1;Trusted_Connection=yes"
  58. cookieless="false"
  59. timeout="20"
  60. />
  61. I.mode:分為off,Inproc,StateServer,SqlServer幾種狀態
  62. mode=InProc儲存在程序中特點:具有最佳的效能,速度最快,但不能跨多臺伺服器儲存共享.mode="StateServer"儲存在狀態伺服器中特點:當需要跨伺服器維護使用者會話資訊時,使用此方法。但是資訊儲存在狀態伺服器上,一旦狀態伺服器出現故障,資訊將丟失.mode="SqlServer"儲存在sqlserver中特點:工作負載會變大,但資訊不會丟失.
  63. II.stateConnectionString:指定asp.net應用程式儲存遠端會話狀態的伺服器名,預設為本機
  64. III.sqlConnectionString:當用會話狀態資料庫時,在這裡設定連線字串
  65. IV.Cookieless:設定為true時,表示不使用cookie會話狀態來標識客戶;否則,相反.
  66. V.TimeOut:用來定義會話狀態儲存的時間,超過期限,將自動終止會話.
  67. 7.<authentication>節
  68. 格式:
  69. <authenticationmode="Forms">
  70. <formsname=".ASPXUSERDEMO"loginUrl="Login.aspx"protection="All"timeout="30"/>
  71. </authentication>
  72. <authorization>
  73. <denyusers="?"/>
  74. </authorization>
  75. I.Windows:使用IIS驗證方式
  76. II.Forms:使用基於窗體的驗證方式
  77. III.Passport:採用Passportcookie驗證模式
  78. IV.None:不採用任何驗證方式
  79. 裡面內嵌Forms節點的屬性涵義:
  80. I.Name:指定完成身份驗證的Httpcookie的名稱.
  81. II.LoginUrl:如果未通過驗證或超時後重定向的頁面URL,一般為登入頁面,讓使用者重新登入
  82. III.Protection:指定cookie資料的保護方式.
  83. 可設定為:AllNoneEncryptionValidation四種保護方式
  84. a.All表示加密資料,並進行有效性驗證兩種方式
  85. b.None表示不保護Cookie.
  86. c.Encryption表示對Cookie內容進行加密
  87. d.validation表示對Cookie內容進行有效性驗證
  88. IV.TimeOut:指定Cookie的失效時間.超時後要重新登入.
  89. 在執行時對Web.config檔案的修改不需要重啟服務就可以生效(注:<processModel>節例外)。當然Web.config檔案是可以擴充套件的。你可以自定義新配置引數並編寫配置節處理程式以對它們進行處理。
  90. web.config配置檔案(預設的配置設定)以下所有的程式碼都應該位於
  91. <configuration>
  92. <system.web>
  93. </system.web>
  94. </configuration>
  95. 之間,出於學習的目的下面的示例都省略了這段xml標記。
  96. 1、<authentication>節
  97. 作用:配置asp.NET身份驗證支援(為Windows、Forms、PassPort、None四種)。該元素只能在計算機、站點或應用程式級別宣告。<authentication>元素必需與<authorization>節配合使用。
  98. 示例:
  99. 以下示例為基於窗體(Forms)的身份驗證配置站點,當沒有登陸的使用者訪問需要身份驗證的網頁,網頁自動跳轉到登陸網頁。
  100. <authenticationmode="Forms">
  101. <formsloginUrl="logon.aspx"name=".FormsAuthCookie"/>
  102. </authentication>
  103. 其中元素loginUrl表示登陸網頁的名稱,name表示Cookie名稱。
  104. 2、<authorization>節
  105. 作用:控制對URL資源的客戶端訪問(如允許匿名使用者訪問)。此元素可以在任何級別(計算機、站點、應用程式、子目錄或頁)上宣告。必需與<authentication>節配合使用。
  106. 示例:以下示例禁止匿名使用者的訪問
  107. <authorization>
  108. <denyusers="?"/>
  109. </authorization>
  110. 注:你可以使用user.identity.name來獲取已經過驗證的當前的使用者名稱;可以使用web.Security.FormsAuthentication.RedirectFromLoginPage方法將已驗證的使用者重定向到使用者剛才請求的頁面.具體的
  111. 3、<compilation>節
  112. 作用:配置asp.NET使用的所有編譯設定。預設的debug屬性為“True”.在程式編譯完成交付使用之後應將其設為False(Web.config檔案中有詳細說明,此處省略示例)
  113. 4、<customErrors>
  114. 作用:為asp.NET應用程式提供有關自定義錯誤資訊的資訊。它不適用於xmlWebservices中發生的錯誤。
  115. 示例:當發生錯誤時,將網頁跳轉到自定義的錯誤頁面。
  116. <customErrorsdefaultRedirect="ErrorPage.aspx"mode="RemoteOnly">
  117. </customErrors>
  118. 其中元素defaultRedirect表示自定義的錯誤網頁的名稱。mode元素表示:對不在本地Web伺服器上執行的使用者顯示自定義(友好的)資訊。
  119. 5、<httpRuntime>節
  120. 作用:配置asp.NETHTTP執行庫設定。該節可以在計算機、站點、應用程式和子目錄級別宣告。
  121. 示例:控制使用者上傳檔案最大為4M,最長時間為60秒,最多請求數為100
  122. <httpRuntimemaxRequestLength="4096"executionTimeout="60"appRequestQueueLimit="100"/>
  123. 6、<pages>
  124. 作用:標識特定於頁的配置設定(如是否啟用會話狀態、檢視狀態,是否檢測使用者的輸入等)。<pages>可以在計算機、站點、應用程式和子目錄級別宣告。
  125. 示例:不檢測使用者在瀏覽器輸入的內容中是否存在潛在的危險資料(注:該項預設是檢測,如果你使用了不檢測,一要對使用者的輸入進行編碼或驗證),在從客戶端回發頁時將檢查加密的檢視狀態,以驗證檢視狀態是否已在客戶端被篡改。(注:該項預設是不驗證)
  126. <pagesbuffer="true"enableViewStateMac="true"validateRequest="false"/>
  127. 7、<sessionState>
  128. 作用:為當前應用程式配置會話狀態設定(如設定是否啟用會話狀態,會話狀態儲存位置)。
  129. 示例:
  130. <sessionStatemode="InProc"cookieless="true"timeout="20"/>
  131. </sessionState>
  132. 注:
  133. mode="InProc"表示:在本地儲存會話狀態(你也可以選擇儲存在遠端伺服器或SAL伺服器中或不啟用會話狀態)
  134. cookieless="true"表示:如果使用者瀏覽器不支援Cookie時啟用會話狀態(預設為False)
  135. timeout="20"表示:會話可以處於空閒狀態的分鐘數
  136. 8、<trace>
  137. 作用:配置asp.NET跟蹤服務,主要用來程式測試判斷哪裡出錯。
  138. 示例:以下為Web.config中的預設配置:
  139. <traceenabled="false"requestLimit="10"pageOutput="false"traceMode="SortByTime"localOnly="true"/>
  140. 注:
  141. enabled="false"表示不啟用跟蹤;
  142. requestLimit="10"表示指定在伺服器上儲存的跟蹤請求的數目
  143. pageOutput="false"表示只能通過跟蹤實用工具訪問跟蹤輸出;
  144. traceMode="SortByTime"表示以處理跟蹤的順序來顯示跟蹤資訊
  145. localOnly="true"表示跟蹤檢視器(trace.axd)只用於宿主Web伺服器
  146. 自定義Web.config檔案配置
  147. 自定義Web.config檔案配置節過程分為兩步。
  148. 1.在配置檔案頂部<configSections>和</configSections>標記之間宣告配置節的名稱和處理該節中配置資料的.NETFramework類的名稱。
  149. 2.是在<configSections>區域之後為宣告的節做實際的配置設定。
  150. 示例:建立一個節儲存資料庫連線字串
  151. <configuration>
  152.  <configSections>
  153.  <sectionname="appSettings"type="System.Configuration.NameValueFileSectionHandler,System,Version=1.0.3300.0,Culture=neutral,PublicKeyToken=b77a5c561934e089"/>
  154. </configSections>
  155.  <appSettings>
  156.   <addkey="scon"value="server=a;database=northwind;uid=sa;pwd=123"/>
  157.  </appSettings>
  158.  <system.web>
  159.   ......
  160.  </system.web>
  161. </configuration>
  162. 訪問Web.config檔案你可以通過使用ConfigurationSettings.AppSettings靜態字串集合來訪問Web.config檔案示例:獲取上面例子中建立的連線字串。例如:
  163. protectedstaticstringIsdebug=ConfigurationSettings.AppSettings["debug"]
  164. 二、web.config中的session配置詳解
  165. 開啟某個應用程式的配置檔案Web.config後,我們會發現以下這段:
  166. <sessionState
  167.   mode="InProc"
  168.   stateConnectionString="tcpip=127.0.0.1:42424"
  169.   sqlConnectionString="datasource=127.0.0.1;Trusted_Connection=yes"
  170.   cookieless="false"
  171.   timeout="20"
  172. />
  173.   這一段就是配置應用程式是如何儲存session資訊的了。我們以下的各種操作主要是針對這一段配置展開。讓我們先看看這一段配置中所包含的內容的意思。sessionState節點的語法是這樣的:
  174. <sessionStatemode="Off|InProc|StateServer|SQLServer"
  175. cookieless="true|false"
  176. timeout="numberofminutes"
  177. stateConnectionString="tcpip=server:port"
  178. sqlConnectionString="sqlconnectionstring"
  179. stateNetworkTimeout="numberofseconds"
  180. />
  181. 必須有的屬性是:屬性選項描述
  182. mode設定將session資訊儲存到哪裡
  183. ØOff設定為不使用session功能,
  184. ØInProc設定為將session儲存在程序內,就是asp中的儲存方式,這是預設值,
  185. ØStateServer設定為將session儲存在獨立的狀態服務中,
  186. ØSQLServer設定將session儲存在sqlserver中。
  187. 可選的屬性是:屬性選項描述
  188. Øcookieless設定客戶端的session資訊儲存到哪裡,
  189. Øture使用Cookieless模式,
  190. Øfalse使用Cookie模式,這是預設值,
  191. Øtimeout設定經過多少分鐘後伺服器自動放棄session資訊,預設為20分鐘。
  192. stateConnectionString設定將session資訊儲存在狀態服務中時使用的伺服器名稱和埠號,例如:"tcpip=127.0.0.1:42424”。當mode的值是StateServer是,這個屬性是必需的。
  193. sqlConnectionString設定與sqlserver連線時的連線字串。例如"datasource=localhost;IntegratedSecurity=SSPI;InitialCatalog=northwind"。當mode的值是SQLServer時,這個屬性是必需的。
  194. stateNetworkTimeout設定當使用StateServer模式儲存session狀態時,經過多少秒空閒後,斷開Web伺服器與儲存狀態資訊的伺服器的tcp/IP連線的。預設值是10秒鐘。
  195. asp.NET中客戶端session狀態的儲存
  196.   在我們上面的session模型簡介中,大家可以發現session狀態應該儲存在兩個地方,分別是客戶端和伺服器端。客戶端只負責儲存相應網站的SessionID,而其他的session資訊則儲存在伺服器端。在asp中,客戶端的SessionID實際是以Cookie的形式儲存的。如果使用者在瀏覽器的設定中選擇了禁用Cookie,那末他也就無法享受session的便利之處了,甚至造成不能訪問某些網站。為了解決以上問題,在asp.NET中客戶端的session資訊儲存方式分為:Cookie和Cookieless兩種。
  197.   asp.NET中,預設狀態下,在客戶端還是使用Cookie儲存session資訊的。如果我們想在客戶端使用Cookieless的方式儲存session資訊的方法如下:
  198.   找到當前Web應用程式的根目錄,開啟Web.Config檔案,找到如下段落:
  199. <sessionState
  200.   mode="InProc"
  201.   stateConnectionString="tcpip=127.0.0.1:42424"
  202.   sqlConnectionString="datasource=127.0.0.1;Trusted_Connection=yes"
  203.   cookieless="false"
  204.   timeout="20"
  205. />
  206.   這段話中的cookieless="false"改為:cookieless="true",這樣,客戶端的session資訊就不再使用Cookie儲存了,而是將其通過URL儲存。關閉當前的IE,開啟一個新IE,重新訪問剛才的Web應用程式,就會看到類似下面的樣子:
  207. 其中,http://localhost/MyTestApplication/(ulqsek45heu3ic2a5zgdl245)/default.aspx中黑體標出的就是客戶端的sessionID。注意,這段資訊是由IIS自動加上的,不會影響以前正常的連線。
  208. asp.NET中伺服器端session狀態的儲存準備工作:
  209.   為了您能更好的體驗到實驗現象,您可以建立一個叫做SessionState.aspx的頁面,然後把以下這些程式碼新增到<body></body>中。
  210. <scriptrunat="server">
  211. SubSession_Add(senderAsObject,eAsEventArgs)
  212.  session("MySession")=text1.Value
  213.  span1.InnerHtml="Sessiondataupdated!<P>Yoursessioncontains:<fontcolor=red>"&session("MySession").ToString()&"</font>"
  214. EndSub
  215. SubCheckSession(senderAsObject,eAsEventArgs)
  216.  If(Session("MySession")IsNothing)Then
  217.    span1.InnerHtml="NOTHING,sessionDATALOST!"
  218.  Else
  219.    span1.InnerHtml="Yoursessioncontains:<fontcolor=red>"&session("MySession").ToString()&"</font>"
  220. EndIf
  221. EndSub
  222. </script>
  223. <formrunat="server"id="Form2">
  224.  <inputid="text1"type="text"runat="server"name="text1">
  225.  <inputtype="submit"runat="server"OnServerClick="Session_Add"
  226.      value="AddtosessionState"id="Submit1"name="Submit1">
  227.  <inputtype="submit"runat="server"OnServerClick="CheckSession"
  228.      value="ViewsessionState"id="Submit2"name="Submit2">
  229. </form>
  230. <hrsize="1">
  231. <fontsize="6"><spanid="span1"runat="server"/></font>
  232.   這個SessionState.aspx的頁面可以用來測試在當前的伺服器上是否丟失了session資訊。
  233. 將伺服器session資訊儲存在程序中
  234.   讓我們來回到Web.config檔案的剛才那段段落中:
  235. <sessionState
  236.   mode="InProc"
  237.   stateConnectionString="tcpip=127.0.0.1:42424"
  238.   sqlConnectionString="datasource=127.0.0.1;Trusted_Connection=yes"
  239.   cookieless="false"
  240.   timeout="20"
  241. />
  242.   當mode的值是InProc時,說明伺服器正在使用這種模式。
  243.   這種方式和以前asp中的模式一樣,就是伺服器將session資訊儲存在IIS程序中。當IIS關閉、重起後,這些資訊都會丟失。但是這種模式也有自己最大好處,就是效能最高。應為所有的session資訊都儲存在了IIS的程序中,所以IIS能夠很快的訪問到這些資訊,這種模式的效能比程序外儲存session資訊或是在sqlserver中儲存session資訊都要快上很多。這種模式也是asp.NET的預設方式。
  244.   好了,現在讓我們做個試驗。開啟剛才的SessionState.aspx頁面,隨便輸入一些字元,使其儲存在session中。然後,讓我們讓IIS重起。注意,並不是使當前的站點停止再開始,而是在IIS中本機的機器名的節點上點選滑鼠右鍵,選擇重新啟動IIS。(想當初使用NT4時,重新啟動IIS必須要重新啟動計算機才行,微軟真是@#$%^&)返回到SessionState.aspx頁面中,檢查剛才的session資訊,發現資訊已經丟失了。
  245. 將伺服器session資訊儲存在程序外
  246.   首先,讓我們來開啟管理工具->服務,找到名為:asp.NETStateService的服務,啟動它。實際上,這個服務就是啟動一個要儲存session資訊的程序。啟動這個服務後,你可以從Windows工作管理員->程序中看到一個名為aspnet_state.exe的程序,這個就是我們儲存session資訊的程序。
  247.   然後,回到Web.config檔案中上述的段落中,將mode的值改為StateServer。儲存檔案後的重新開啟一個IE,開啟SessionState.aspx頁面,儲存一些資訊到session中。這時,讓我們重起IIS,再回到SessionState.aspx頁面中檢視剛才的session資訊,發現沒有丟失。
  248.   實際上,這種將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服務。
  249. 將伺服器session資訊儲存在sqlserver中
  250.   首先,還是讓我們來做一些準備工作。啟動sqlserver和sqlserver代理服務。在sqlserver中執行一個叫做InstallSqlState.sql的指令碼檔案。這個指令碼檔案將在sqlserver中建立一個用來專門儲存session資訊的資料庫,及一個維護session資訊資料庫的sqlserver代理作業。我們可以在以下路徑中找到那個檔案:
  251. [systemdrive]/winnt/Microsoft.NET/Framework/[version]/
  252.   然後開啟查詢分析器,連線到sqlserver伺服器,開啟剛才的那個檔案並且執行。稍等片刻,資料庫及作業就建立好了。這時,你可以開啟企業管理器,看到新增了一個叫ASPState的資料庫。但是這個資料庫中只是些儲存過程,沒有使用者表。實際上session資訊是儲存在了tempdb資料庫的ASPStateTempSessions表中的,另外一個ASPStateTempApplications表儲存了asp中application物件資訊。這兩個表也是剛才的那個指令碼建立的。另外檢視管理->SQLserver代理->作業,發現也多了一個叫做ASPState_Job_DeleteExpiredSessions的作業,這個作業實際上就是每分鐘去ASPStateTempSessions表中刪除過期的session資訊的。
  253.   接著,我們返回到Web.config檔案,修改mode的值改為SQLServer。注意,還要同時修改sqlConnectionString的值,格式為:
  254. sqlConnectionString="datasource=localhost;IntegratedSecurity=SSPI;"
  255.   其中datasource是指sqlserver伺服器的ip地址,如果sqlserver與IIS是一臺機子,寫127.0.0.1就行了。IntegratedSecurity=SSPI的意思是使用Windows整合身份驗證,這樣,訪問資料庫將以asp.NET的身份進行,通過如此配置,能夠獲得比使用userid=sa;password=口令的sqlserver驗證方式更好的安全性。當然,如果sqlserver運行於另一臺計算機上,你可能會需要通過ActiveDirectory域的方式來維護兩邊驗證的一致性。
  256.   同樣,讓我們做個試驗。向SessionState.aspx中新增session資訊,這時發現session資訊已經存在sqlserver中了,即使你重起計算機,剛才的session資訊也不會丟失。現在,你已經完全看見了session資訊到底是什麼樣子的了,而且又是儲存在sqlserver中的,能幹什麼就看你的發揮了。
  257. 總結
  258. 三、asp.net關於form認證的一般設定
  259. asp.net關於form認證的一般設定:
  260. 1:在web.config中,加入form認證;
  261. <authenticationmode="Forms">
  262. <formsname="auth"loginUrl="index.aspx"timeout="30"></forms>
  263. </authentication>
  264. <authorization>
  265. <denyusers="?"/>
  266. </authorization>
  267. 2:如果有註冊頁面時還應該允許匿名使用者呼叫註冊頁面進行註冊;
  268. 以下程式碼應該在<configuration><system.web>之間,而不應該包含到<system.web>..</system.web>之間;
  269. ----------------表示允許匿名使用者對userReg.aspx頁面進行訪問.
  270. <locationpath="userReg.aspx">
  271. <system.web>
  272. <authorization>
  273. <allowusers="?"/>
  274. </authorization>
  275. </system.web>
  276. </location>
  277. 3在登入成功後要建立身份驗證票,表明已經通過認證的合法使用者;
  278. if(登陸成功)
  279. System.Web.Security.FormsAuthentication.SetAuthCookie(使用者名稱稱,false);
  280.   四、訪問Web.config檔案
  281.   你可以通過使用ConfigurationSettings.AppSettings靜態字串集合來訪問Web.config檔案示例:獲取上面例子中建立的連線字串。例如:
  282. protectedstaticstringIsdebug=ConfigurationSettings.AppSettings["scon"]
  283. asp.Net效能優化.
  284. (一).選擇會話狀態儲存方式
  285. 在Webconfig檔案配置:
  286. <sessionStatemode="???"stateConnectionString="tcpip=127.0.0.1:42424"
  287. sqlConnectionString="datasource=127.0.0.1;Trusted_Connection=yes"
  288. cookieless="false"timeout="20"/>
  289. asp.net有三種方式儲存會話狀態資訊:
  290. 1.儲存在程序中:屬性mode=InProc
  291. 特點:具有最佳的效能,速度最快,但不能跨多臺伺服器儲存共享.
  292. 2.儲存在狀態伺服器中:屬性mode="StateServer"
  293. 特點:當需要跨伺服器維護使用者會話資訊時,使用此方法。
  294. 但是資訊儲存在狀態伺服器上,一旦狀態伺服器出現故障,資訊將丟失
  295. 3.儲存在sqlserver中:屬性mode="SqlServer"
  296. 特點:工作負載會變大,但資訊不會丟失.
  297. 補充一點:
  298. I.由於某些頁面不需要會話狀態,則可以將會話狀態禁用:
  299. 程式碼如下:<%@PageEnableSessionState="false"%>
  300. II.如果頁面需要訪問會話變數但不允許修改它們,可以設定頁面會話狀態為只讀:
  301. 程式碼如下:<%@PageEnableSessionState="false"%>
  302. 使用時可以根據具體情況選擇某種方式
  303. (二).使用Page.IsPostBack
  304. Page.IsPostBack表示是否是從客戶端返回的.初次執行時,不是從客戶端返回,它的值
  305. false,當觸發頁面上的事件或重新整理頁面時,Page.IsPostBack由於是回發的,值變為true;
  306. 一般在:Page_Load方法中用:
  307. privatevoidPage_Load(Objectsender,EventArgse)
  308. {
  309. if(!Page.IsPostBack)
  310. {
  311. ....;//初始化頁面的程式碼。這些程式碼第一次頁面初始化時執行,當第二次回發時,
  312. //不會再執行。提高效率。
  313. }
  314. }
  315. 往往很多時候不得不用IsPostBack,因為有些控制元件初始化後,要保持它的狀態.
  316. 例如:DropDownList,如果每次都初始化,則使用者無論選擇其選項,都會被初始化為預設值.
  317. (三).避免使用伺服器控制元件
  318. 1.一般的靜態顯示資訊,儘量不要用服務端控制元件顯示.因為服務端控制元件需要回發服務端執行,
  319. 會降低程式執行效率,一般用<DIV>顯示即可.
  320. 如果用了服務端控制元件,將:runat="server"去掉,也會提高效率.
  321. 2.禁用服務端控制元件的狀態檢視,有些控制元件不需要維護其狀態,可以設定其屬性:EnableViewState=false;
  322. 如果整個頁面控制元件都不需要維持狀態檢視,則可以設定整個頁面的狀態視力為false:
  323. 程式碼如下:<%@PageEnableViewState="false"%>
  324. 3.在Web.Config檔案中配置:
  325. asp.NETSessionss可以在Web.config或Machine.config中的Sessionsstate元素中配置。
  326. 下面是在Web.config中的設定的例子:
  327. <Sessionsstatetimeout="10"cookieless="false"mode="Inproc"/>
  328. (四).避免使用DataGrid
  329. 大家都知道DataGrid功能強大。但是功能強大的同時,增加了效能上的開銷。一般用其它控制元件:DataList
  330. 或Repeater控制元件能實現的,儘量不用DataGrid.
  331. (五).字串操作
  332. 1.避免裝箱操作.裝箱操作執行效率比較低.
  333. 例如執行兩個程式碼段:
  334. stringtest="";
  335. for(forinti=0;i<10000;i++)
  336. {
  337. test=test+i;
  338. }
  339. stringtest="";
  340. for(forinti=0;i<10000;i++)
  341. {
  342. test=test+i.ToString();
  343. }
  344. 下面的程式碼段顯然效率要高.因為i是整型的,系統要先把i進行裝箱轉換為string型的,再進行連線.需要時間
  345. 讀者可以Copy到自己機器上測試一下.
  346. 2.使用StringBulider類
  347. 在進行字串連線時:stringstr=str1+str2+....;
  348. 一般超過三項連線,最好用StringBuilder來代替string類.StringBuilder可以避免重新建立string物件造成
  349. 的效能損失.
  350. 一般用於組裝sql語句時用到:StringBulider.
  351. 讀者可以到自己機器上測試一下.
  352. 3.儘量少用:
  353. try
  354. {}
  355. catch
  356. {}
  357. finally
  358. {}
  359. 語句.此語句執行效率比較低.
  360. (六).ADO.Net使用方面優化
  361. 1.資料庫連線開啟和關閉。在需要連線時開啟,當訪問完資料庫要立刻關閉連線.
  362. 舉例說明,還是看兩個程式碼段:
  363. I.
  364. DataSetds=newDataSet();
  365. SqlConnectionMyConnection=newSqlConnection("server=localhost;uid=sa;pwd=;database=NorthWind");
  366. SqlCommandmyCommand=newSqlCommand(strSql,MyConnection);
  367. SqlDataAdaptermyAdapter=newSqlDataAdapter(queryStr,connectionStr);
  368. MyConnection.Open();//開啟連線
  369. for(inti=0;i<1000;i++)//for迴圈模擬取得資料前的商業邏輯操作
  370. {
  371. Thread.Sleep(1000);
  372. }
  373. myAdapter.Fill(ds);
  374. for(inti=0;i<1000;i++)//for迴圈模擬取得資料後的商業邏輯操作
  375. {
  376. Thread.Sleep(1000);
  377. }
  378. MyConnection.Close();//關閉連線
  379. II.
  380. DataSetds=newDataSet();
  381. SqlConnectionMyConnection=newSqlConnection("server=localhost;uid=sa;pwd=;database=NorthWind");
  382. SqlCommandmyCommand=newSqlCommand(strSql,connectionStr);
  383. for(inti=0;i<1000;i++)//for迴圈模擬取得資料前的商業邏輯操作
  384. {
  385. Thread.Sleep(1000);
  386. }
  387. MyConnection.Open();//開啟連線
  388. myAdapter.Fill(ds);
  389. MyConnection.Close();//關閉連線
  390. for(inti=0;i<1000;i++)////for迴圈模擬取得資料後的商業邏輯操作
  391. {
  392. Thread.Sleep(1000);
  393. }
  394. 顯示II程式碼比I程式碼好的多,I中早早佔著連線不放,如果使用者很多的話,容易出現連線池滿情況。嚴重時出現宕機現象.
  395. 2.資料庫查詢
  396. I.直接生成sql語句。sqlserver每次都要對其進行編譯,在效能方面不會有很大的提高。另外也不夠安全。容易被攻擊.
  397. II.使用帶引數的sql命令。這種方式sqlserver只對其編譯一次,對於不同的引數可以重複使用編譯後的命令。提高了效能.
  398. III.使用sqlserver儲存過程.編譯一次.具有獨立性,便於修改和維護.一次能完成用語句傳送多次的功能.減少了網路的
  399. 流量。並不一定儲存過程一定比語句效率要高,如果商業邏輯很複雜的話,有時候用語句比儲存過程效率要高.
  400. (七).快取優化
  401. 快取分為兩種:頁面快取和API快取.
  402. 1.使用頁面快取和片段快取
  403. <%@OutputCacheDuration="5"VaryByParam="None"%>
  404. <%@OutputCacheDuration=60VaryByParam=”TextBox1,TextBox2”%>
  405. 說明:Duration是設定Cache的過期時間;
  406. VarByParam是設定是否根據引數而變化,None時所有引數使用同一Cache,
  407. 設定TextBox1時則根據TextBox1的不同值分別快取;當有多個引數時則要組合快取;
  408. 2.API快取。用於在應用程式中使用
  409. I.一個Cache使用的例子:
  410. http://blog.csdn.net/chengking/archive/2005/10/03/494545.aspx
  411. II.使用時注意Page.Cache和HttpContext.Current.Cache區別:
  412. 它們指的同一個物件,在Page裡,用Page.Cache,如果在global.asax或自己的類裡用:HttpContext.Current.Cache在有些事件中,由於其沒有HttpContext,就用HttpRuntime.Cache.

轉載:https://www.cnblogs.com/flyinghigher/archive/2012/03/15/2398669.html