天天看點

ASP.NET自定義錯誤頁面,分離配置資訊,多環境釋出

今天主要說三個内容,都是和ASP.NET有關的内容。

第一個關于自定義錯誤的,就是在網站出現404或者500的錯誤,如何給使用者顯示一個友好的界面。

第二個是分離配置檔案web.config,如果配置資訊很多,都放在web.cofig檔案,檔案會越來越大,越來越長。資訊太多了,不便于浏覽和維護,如果能分成獨立的config該多好。

第三個是關于多環境釋出的,多環境指的是:開發環境,測試環境,生産測試環境,生産環境。利用VS友善多環境的配置檔案修改。

1.自定義錯誤

這裡說的錯誤,多指http的錯誤,例如,404找不到通路的資源,403未授權,500伺服器錯誤。

1.1用代碼引導使用者

Response.Write("<h1>400</h1>"); 

Response.Redirect("404.html"); 

兩種方式:

一種是直接給使用者呈現資訊,使用response.write來完成。

一種是引導使用者跳轉到一個做好的頁面。

1.2使用配置檔案

1.2.1 customerrors

在web.cofig檔案中提供了一個關于自定義錯誤的配置節,通過配置,就可以實作錯誤自動跳轉。

<system.web> 

  <customErrors defaultRedirect="/views/shared/error.aspx" mode="Off"> 

    <error statusCode="404" redirect="/views/shared/404.aspx" /> 

  </customErrors> 

</system.web> 

上面的配置中說明,如果出現404就跳轉到/views/shared/404.aspx頁面,其他的就跳轉到/views/shared/error.aspx頁面。

mode有三個值可選。

Off,關閉自定義錯誤,直接顯示錯誤資訊。在開發環境可以使用這個選項,便于差錯。

On,使用自定義錯誤,不管是本地通路,還是遠端通路。在生産環境建議使用這個選項,因為使用者看到錯誤資訊是不友好的,而且由于錯誤資訊中可能包好trace stack,這些資訊會暴漏系統内部的一些資訊,可能會帶來麻煩。

RemoteOnly,遠端通路使用自定義錯誤,本地通路顯示詳細資訊。

1.2.2 throw new HttpException(404, "Not Found");

還有一些場景,如果我們的一些業務也想使用自定義錯誤的配置資訊,顯示相應的錯誤頁面,那就需要在代碼中抛出相應的異常HttpException。

if(true) 

  throw new HttpException(404, "Not Found"); 

有一些人提出設定Response.StatusCode=404。

在iis6中設定statuscode不起作用,不會跳轉,因為雖然code被修改為404,但是沒有對輸出内容作修改,還不是正真的http異常,是以沒有自定跳轉。但是可以

throw new HttpException(404, "Not Found")

這樣就可以使用自定義錯誤了。

在iis7的內建模式中,設定statuscode=404,可以實作自動跳轉。

當然了,在業務中使用httpcode,可能不太合适,加強了應用和httpcode的耦合,而且看起來也不是很舒服。針對業務的錯誤提示,還是單獨設計,單獨實作的比較好。

關于customErrors的詳細資訊,可以看下面的兩篇文章。

<a href="http://msdn.microsoft.com/zh-cn/library/h0hfz6fc(v=vs.80).aspx" target="_blank">customErrors 元素(ASP.NET 設定架構)</a>

<a href="http://www.cnblogs.com/ap0606122/archive/2011/07/07/2099937.html" target="_blank">關于web.config中&lt;customErrors&gt;節點說明</a>

2.分離配置檔案

分離之後有一點需要注意,就是修改分離的配置檔案,iis不會重新加載分離配置檔案中的資訊,隻有修改web.config檔案,才會重新加載所有配置檔案(包括分離的配置檔案)的資訊。

&lt;appSettings configSource="appSettings.config"&gt;&lt;/appSettings&gt; 

&lt;appSettings file="appSettings.config"&gt;&lt;/appSettings&gt; 

appSettings.config

&lt;?xml version="1.0" encoding="utf-8" ?&gt; 

&lt;appSettings&gt; 

  &lt;add key="title" value="debug "/&gt; 

&lt;/appSettings&gt; 

上面額兩種都可以實作分離配置檔案,将appSettings中的配置獨立出來。有file屬性的節點比較少,但是很多節點都有configSource屬性。

3.釋出環境配置檔案

項目一般都會有三個環境:開發,測試,生産。

随着項目越做越大,越來越複雜,可能還會有更多的環境,例如預釋出環境,自動化測試環境,手動測試環境,生産環境1,生産環境2。

總之,就是環境多了。

每個環境的配置資訊不同,例如:資料庫連接配接不同,和資料相關的配置不同,還有一些環境特定的自定義配置。

但是有一些是相同的。

如果我們隻是簡單的copy很多份配置檔案,做起來就很累。比如說有一個配置需要修改,但是這個配置在每個環境是相同的,那麼重複工作就很多。

其實VS工具給我們提供了一個友善的多環境配置管理,我們隻要按照配置使用就可以了。

實用vs建立web application項目之後,在web.config檔案下面,會同時存在web.debug.config,web.release.config,這就是預設提供的調試和釋出兩種環境配置。

我們還可以建立更多,在工具欄中有一個配置管理器,就是有一個下拉框,可以拉出來debug和release的那個地方,下拉項中還有一個配置管理器,打開之後,在左側的下拉框中可以選擇建立,就可以建立一種配置了。

之後就會發現下拉框中多了一個剛才建立的配置項,但是還沒有多個配置檔案。配置檔案需要手動添加,在web.config檔案上點選右鍵,在菜單中選擇【添加配置轉換】,就會多一個檔案,假設剛才建立的配置叫Testing,這個檔案就是web.Testing.config。

在web.Testing.config檔案中已經有兩個例子,可以讓你快速的上手。

設定屬性。

&lt;!-- 

    在下例中,“SetAttributes”轉換将更改  

    “connectionString”的值,以僅在“Match”定位器  

    找到值為“MyDB”的特性“name”時使用“ReleaseSQLServer”。 

    &lt;connectionStrings&gt; 

      &lt;add name="MyDB"  

        connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"  

        xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/&gt; 

    &lt;/connectionStrings&gt; 

  --&gt; 

移除屬性。

&lt;compilation xdt:Transform="RemoveAttributes(debug)" /&gt; 

替換節點。

      在下例中,“Replace”轉換将替換  

      web.config 檔案的整個 &lt;customErrors&gt; 節。 

      請注意,由于  

      在 &lt;system.web&gt; 節點下僅有一個 customErrors 節,是以不需要使用“xdt:Locator”特性。 

      &lt;customErrors defaultRedirect="GenericError.htm" 

        mode="RemoteOnly" xdt:Transform="Replace"&gt; 

        &lt;error statusCode="500" redirect="InternalError.htm"/&gt; 

      &lt;/customErrors&gt; 

    --&gt; 

關于更詳細的的使用,可以參考下面的兩篇文章。

<a href="http://msdn.microsoft.com/library/dd465326.aspx" target="_blank">Web.config Transformation Syntax for Web Application Project Deployment Using Visual Studio</a>

<a href="http://blogs.msdn.com/b/webdev/archive/2009/05/04/web-deployment-web-config-transformation.aspx" target="_blank">Web Deployment: Web.Config Transformation</a>

本文轉自 virusswb 51CTO部落格,原文連結:http://blog.51cto.com/virusswb/1090636,如需轉載請自行聯系原作者

繼續閱讀