2009年5月10日 星期日

ASP.NET Web Site 使用Trace.WriteLine()無效??

ASP.NET 有提供追蹤的功能, 你在網頁是會這樣寫:
Trace.Write("category","message")

這個實際上是System.Web.TraceContext類別. 它當然不會有問題.

這裡說的是System.Diagnostics 命名空間中的Trace 類別.
當你在網頁中撰寫Trace.WriteLine() 的指令時, 會發現無效, 不管是不是在除錯模式下, 它無法被列印出來.

這是因為Visual Studio的Web Site 專案模式, 對於網頁的編譯動作並沒有將TRACE 定義編譯進來, 所以Trace 指令會無效.

因此, 必須修改Web.config 的<system.codedom> 中的 <compiler ...
要加上 compilerOptions, VB 與 C# 的參數不同.
VB
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" warninglevel="4" compilerOptions="/d:TRACE=TRUE" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">

C#
<compiler language="c#;cs;csharp" extension=".cs" warninglevel="4" compilerOptions="/d:TRACE" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">

預設System.Diagnostics.Trace 會輸出到Visual Studio 的Output Window, 可是大部份的情況會想讓他輸出的檔案或事件檢視器, 你可以再加上以下設定:
<configuration> <system.diagnostics> <trace autoflush="true" >
<listeners>
<add name="myListener" type="System.Diagnostics.TextWriterTraceListener, system version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" initializeData="c:\myListener.log" />
<add name="MyEventListener" type="System.Diagnostics.EventLogTraceListener, system version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" initializeData="MyConfigEventLog"/>
</listeners>
</trace>
</system.diagnostics>

另一個問題:
如何ASP.NET 的Trace.Write("category","message") 功能也可以像System.Diagnostics的Trace 一樣可以輸出到檔案或事件記錄檔呢?
答案很簡單:
<configuration>
<system.web>
<trace enabled="true" writeToDiagnosticsTrace="true" />
<system.web>
<configuration>

當然要能成功的輸出必須設定compilerOptions 及 listener

2009年5月2日 星期六

List 的 其他排序選擇

List 有提供 Sort 方法, 當你呼叫它時, 它會根據項目的型別裡實作的IComparable介面的CompareTo方法排序.

同學問到了, 如果我想提供其他的排序方式, 怎麼寫?

可以在項目的型別裡加上新的比較方法:
Shared Function EmpSortByName(ByVal emp1 As Employee, ByVal emp2 As Employee) As Integer
Return emp1.Name.CompareTo(emp2.Name)
End Function

然後在呼叫Sort 方法時指定這個Delegate
Dim employees As New List(Of Employee)
employees.Add(New Employee(101, "Anita", #7/1/1999#))
employees.Add(New Employee(201, "Andy", #7/1/1998#))
employees.Add(New Employee(301, "Lisa", #1/1/2009#))
employees.Add(New Employee(102, "Mary", #7/1/2000#))
employees.Sort(AddressOf Employee.EmpSortByName)

2009年4月13日 星期一

Window Service 如何偵錯?

這是4/12 上 u2956c .NET Framework 課程時同學問的問題.

解法步驟如下:

  1. 首先啟用你寫好的Windows Service
  2. 開啟要偵錯的Windows Service 專案, 並設定中斷點.
  3. 接著Tools --> Attach to Process, 選取服務的Proccess 項目 (如果找不到請勾選 Show processes from all users, 就可找到)

這樣就可以進入Windows 服務的偵錯模式了.

2009年4月9日 星期四

在Windows Server 2008 上使用.NET 3.0的特性

Winwdows Server 2008改變很大, 有多大, 我不是這方面的專家,
只就我需要用到的功能來討論.

如果你是一個開發者, 網頁的開發者, WPF, WCF, WF (.NET 3.0)的開發者
那麼你一定需要用到IIS, 以及.NET Framework 3.0 的一些元件,
在Windows Server 2008這些預設並不會安裝進來, 必須自行安裝.

如果你與我一樣, 直接到新增移除程式去安裝的話, 下場就是...找不到你要的項目...嗚~

那些Windows 元件到那裡去了?

答案是在 "Server Manager"
接下來是我的筆記, 只要按步驟就可找到要的項目了.

安裝IIS
如果這台 Server 準備當做 Web Server, 那麼它就是擔任一個 Web Server 的角色,
所以要到Server Manager 裡的Roles 項目, Add Roles 裡就可找到IIS 了.

安裝.NET Framework 3.0要用的功能
Server Manager 裡的Roles 項目, Add Roles, Application Server Foundation
另外還要安裝.NET Framework 3.0 Features
Server Manager 裡的Features項目, Add Features, 選.Net Framework 3.0 Features

將Windows Server 2008 桌面主題變成Vista 的Aero

Windows Server 2008 的工作主要是後端的服務工作, 不太需要太美的畫面.
所以它出廠預設使用的桌面主題以Windows Classic 或 Standard 為主.
你無法在 Appearance Settings 裡看到 Windows Aero 的項目.

可是, 如果你像我一樣, 必須有個Server 環境同時又會在上面開發Client 端的軟體,
使用Windows Server 2008 時, 你一定很希望看到如同使用者會看到的Vista 界面,
有解嗎?

有的.

如下步驟:
1.在Server Manager的 Features 項目上, 按Add Features, 將Desktop Experience 項目安裝進來.
2.重新開機.
3.Administrative Tools --> Service , 啟用Theme
4.在Desktop 上按右鍵, 選Personalization
5.Appearance 項目上就會看到Windows Aero, 選擇並套用即可.

2008年11月26日 星期三

應用程式如何得知 "控制台" --> "地區語言選項" 的改變

系統事件的使用者喜好設定變更時可以藉由 命名空間Microsoft.Win32 的 SystemEvents.UserPreferenceChanged 事件進行通知,

以下程式是註冊該事件

Visual Basic
AddHandler SystemEvents.UserPreferenceChanged, AddressOf SystemEvents_UserPreferenceChanged DisplayCultureInfo()
C#
SystemEvents.UserPreferenceChanged += new UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged);

它的事件參數 UserPreferenceChangedEventArgs 的 Category 屬性會傳入變更的事件類別, 如果是 "地區語言選項" 的改變, 是 UserPreferenceCategory.Locale

事件程序如下:

Visual Basic
Sub SystemEvents_UserPreferenceChanged(ByVal sender As Object, ByVal e As Microsoft.Win32.UserPreferenceChangedEventArgs)
        If e.Category = UserPreferenceCategory.Locale Then
            DisplayCultureInfo()
        End If
    End Sub
C#
static void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e)
{
if (e.Category== UserPreferenceCategory.Locale )
DisplayCultureInfo();
}

Thread.CurrentThread.CurrentCulture 會回傳目前執行緒的文化特性, 只有應用程式載入初期會寫入這個值, 所以控制台改變, 這個值並不會跟著異動, 若要取得控制台最新的文化特性, 必須先將目前的快取資料清除, 呼叫ClearCachedData 方法. 當快取被清除時, 將會自動取得控制台最新的設定.

Visual Basic
    Sub DisplayCultureInfo()
        Thread.CurrentThread.CurrentCulture.ClearCachedData()
        Dim UsersCulture As CultureInfo = Thread.CurrentThread.CurrentCulture
        Dim region As New RegionInfo(UsersCulture.Name)
        Console.WriteLine(region.DisplayName)
        Console.WriteLine(region.EnglishName)
        Console.WriteLine(region.NativeName)
        Console.WriteLine(region.CurrencyEnglishName)
        Console.WriteLine(region.CurrencyNativeName)
    End Sub
C#
private static void DisplayCultureInfo()  
{
Thread.CurrentThread.CurrentCulture.ClearCachedData();
CultureInfo UsersCulture = Thread.CurrentThread.CurrentCulture;
RegionInfo region = new RegionInfo(UsersCulture.Name);
Console.WriteLine(region.DisplayName);
Console.WriteLine(region.EnglishName);
Console.WriteLine(region.NativeName);
Console.WriteLine(region.CurrencyEnglishName);
Console.WriteLine(region.CurrencyNativeName);
}

2008年11月9日 星期日

ASP.NET 專案的 Profile

如果你使用Visual Studio的 File --> New Web Site 來設計專案時, Web.config定義好Profile 的屬性並存檔之後, 在程式中使用Profile 會有Intellisence 自動列表相關屬性.

WebSite模式是將profile的properties 建立成一個Strongly Type, 請看下圖:

建立成一個Strongly Type

可是如果使用File --> New Project , 建立ASP.NET Web Application時, Web.config定義好Profile 的屬性並存檔之後, 在程式中使用Profile, Intellisence 所列表的資訊竟與前者完全不同, 而且並沒有定義好的屬性... 真是傷腦筋!!

用Object Browser 完全看不到Strongly type 的Profile類別...

2

這難道就不能用Profile 的功能了嗎? 答案: 並不是...

只是寫起來真的很麻煩, 必須使用HttpContext.Current.Profile的SetPropertyValue及GetPropertyValue存取屬性內容.

例如, 修改FirstName 的屬性

HttpContext.Current.Profile.SetPropertyValue ("FirstName", "Lisa")

讀取FirstName的屬性

Dim FName As String = HttpContext.Current.Profile.SetPropertyValue ("FirstName").ToString()

 

Ps.這是上課時同學發現Profile 沒有IntelliSense, 仔細看一下Soluction Explorer 才發現是專案模式而不是Web Site模式....但還是感到相當意外, 竟然在專案模式下的Profile不是Strongly type..., 只好用原始方式找答案.

Ps.用VS2005與VS2008 的Project 模式的Profile 都不是Strongly type.