2008年5月17日 星期六

ASP.NET 3.5 網站統一錯誤處理通知

開發網站時,最怕使用者抱怨,怎麼出現一個好奇怪的畫面, 而這個畫面就是程式執行錯誤的頁面,因此統一錯誤管理變成是開發網站一定要規劃設計的一個功能,如果要在統一錯誤處理頁面再去使用MAIL將訊息傳送給管理員,就可以搭配.NET的傳送MAIL機制,以下亞當斯寫一個可以管理網站整體錯誤的實用範例,步驟如下:

1.在Global.asax的Application_Error事件中,使用Server.Transfer將網頁導到統一處理錯誤的頁面GenericErrorPage.aspx:

void Application_Error(object sender, EventArgs e) 
{
Server.Transfer("~/GenericErrorPage.aspx");
}

2.在GenericErrorPage.aspx的Page_Load事件中,先判斷Server.GetLastError()不為null代表有錯誤要處理。

//如果有錯誤需要處理的話
if (Server.GetLastError() != null)
{
//……
}

3.使用MAIL來通知管理者錯誤訊息,首先匯入System.Net.Mail命名空間


<%@ Import Namespace="System.Net.Mail" %>


4.建立MailMessage物件

//使用asp.net 傳送MAIL
MailMessage mm = new MailMessage("admin@asp.net",
"adams@uuu.com.tw",
"網站錯誤訊息",
Server.GetLastError().GetBaseException().Message);

5.接著先使用Server.ClearError();將錯誤清除 6.最後再用SmtpClient物件來傳送紀錄錯誤的訊息給管理員。

try
{
//針對已經的錯誤(如:Send Mail)做處理
SmtpClient sc = new SmtpClient("localhost");
sc.Send(mm);
}
catch (Exception ex)
{
Response.Write(ex.Message );
}

2008年5月11日 星期日

將Out-of-Process的Session放在自訂的資料庫中

用SQL Server儲存Session之前,必須先到 %windows%\Microsoft.NET\Framework\versionNumber 路徑下執行Aspnet_regsql.exe 工具程式,安裝Session State資料庫,指令為:

  • 存在TEMP資料庫:aspnet_regsql.exe -S localhost -E -ssadd SessionState01
  • 存在ASPState資料庫:aspnet_regsql.exe -S localhost -E -ssadd -sstype p SessionState02
  • 存在自訂資料庫:aspnet_regsql.exe -S localhost -E -ssadd -sstype c -d Northwind SessionState03

接著要在網站的web.config中設定<sessionState>項目,指定將Session存放到自訂的資料庫,例如亞當斯要把Session物件存放到Northwind資料庫中的話,那麼就要做以下的設定:

<sessionState mode="SQLServer"
sqlConnectionString="Server=localhost;uid=sa;pwd=P@ssw0rd;Database=Northwind"
allowCustomSqlDatabase="true" />

2008年5月10日 星期六

設計 ASP.NET 3.5 行事曆

如果設計網站的行事曆,最簡單的方式就是使用ASP.NET 3.5中的Calendar控制項,不過因為行事曆必須在每個日期中有一些特殊的事件會發生,所以只用單純的Calendar當然無法滿足需求,因此我們必須針對Calendar來修訂,事實上在設計時可以在DayRender事件中改寫程式碼即可,假設一般的Calendar會呈現為:Calendar

那麼修改設計步驟如下:

1.在Calendar控制項的DayRender事件中加入程式碼,欲設計的行事曆資料可以來自資料庫資料,或者是指定某個特定日期,例如:10/1o國慶日,當然也可以當作會議行事曆來使用,這邊亞當斯在DayRender事件中先將本月非假日的背景顏色改掉。

protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
{
//非假日時,將背景顏色改掉
if (!e.Day.IsOtherMonth && !e.Day.IsWeekend)
e.Cell.BackColor = System.Drawing.Color.Yellow;
}


2.接著使用e.Dat.Date去判斷目標日期,或是想要改寫的日期,例如:2008/5/11 母親節。



protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
{
  //非假日時,將背景顏色改掉
  if (!e.Day.IsOtherMonth && !e.Day.IsWeekend)
    e.Cell.BackColor = System.Drawing.Color.Yellow;
  //特定日期,加入控制項
    DateTime dt = new DateTime(2008,5,11);
    if(e.Day.Date  == dt)
    {

      //程式碼...
    }
}


3.使用程式動態產生出ASP.NET 3.5的控制項,這邊亞當斯用HyperLink讓使用者可以點下HyperLink後,將這天的資訊帶到另外一網頁做處理或檢視,另外因為 Calendar 控制項時會引發 DayRender 事件,所以不可以加入也會引發事件的控制項,例如 LinkButton。也就是說只能夠加入靜態控制項,例如 System.Web.UI.LiteralControl、Label、Image 以及 HyperLink。



4.最後,用e.Cell.Controls.Add方法將產生出來的控制項加入Calendar控制項中即可。



protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
{
//非假日時,將背景顏色改掉
if (!e.Day.IsOtherMonth && !e.Day.IsWeekend)
e.Cell.BackColor = System.Drawing.Color.Yellow;

//特定日期,加入控制項
DateTime dt = new DateTime(2008,5,11);
if(e.Day.Date == dt)
{
HyperLink link = new HyperLink();
link.NavigateUrl = "http://ms-net.blogspot.com";
link.Text = "母親節";

e.Cell.Controls.Add(link);
e.Cell.BackColor = System.Drawing.Color.Red;
}
}


5.執行後的結果如下:Calendar

2008年5月8日 星期四

將ASP.NET3.5健康監控(Health Monitoring)資訊紀錄到SQL Server

以健康監控的功能來看,目前ASP.NET 3.5有內建 Web 事件,並且已經設定提供者當做系統預設值。但是,rules 項目中只啟用兩個事件:All Errors 和 Failure Audits,這兩個事件都已啟用並且已由 EventLogProvider 訂閱。 所以如果要將記錄的資料用資料庫來保存的話,那麼就外另外設定使用:SqlWebEventProvider 才行。

以下是亞當斯設計的步驟:

1.一開始先新增一支DemoHealthMonitoring.aspx給個按鈕,動作是產生自訂錯誤 :
protected void Button1_Click(object sender, EventArgs e) 

    throw new Exception("自訂錯誤"); 
}
3.執行後,可以先檢視事件檢視器,並且對照機器層級的Web.config設定,可看到有WebEvent被觸發紀錄。HealthMonitoring-01

4. 接下來可以透過設定將網頁事件紀錄到SQL中,設定方式為設定Web.config中的<healthMonitoring> ,設定如下 : 

<healthMonitoring>
  <!--先加入一個eventMappings偵測網頁事件-->
  <eventMappings>
    <add name="ASP.NET Events"
         type="System.Web.Management.WebBaseEvent"/>
  </eventMappings>
  <!--設定使用SQL來記錄訊息-->
  <providers>
    <add name="MySqlWebEventProvider"
      type="System.Web.Management.SqlWebEventProvider"
      connectionStringName="LocalSqlServer"
      bufferMode="Notification"/>
  </providers>
  <!--設定規則-->
  <rules>
    <add
      name="All Errors"
      eventName="ASP.NET Events"
      provider="MySqlWebEventProvider" />
  </rules>
</healthMonitoring>

5.再次執行DemoHealthMonitoring.aspx,過一分鐘後可以檢視App_Data中, 會多了一個ASPNETDB.MDF資料庫,檢視其中的aspnet_WebEvent_Events資料表即可!!HealthMonitoring-02

下列檔案為此篇文章的範例程式,有興趣的朋友可自行下載: