2010年3月30日 星期二

Ajax Enabled WCF Service on IIS 7 always return 404 error

最近 study 了 Ajax enabled WCF Service,覺的著實好用。於是想放到 MOSS 上。而 MOSS 是位於 Windows Server 2008 的 IIS 7 上。一試,就發現 IIS 7 執行 svc 時是正常的,但一執行 *.svc/js 就會回傳 404 (not found) 的錯誤。

然而,在 IIS 6 (windows 2003) 上不會發生這個問題。

花了一整天,都在處理這個 Issue。一度還以為是 moss 的問題。

現在終於找到了原因。在此將完整的步驟記錄下來。

  1. 建立一個 WCF Service. 並且記得要 加上[ServiceContract],[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
  2. 在 config 上,使用 webHttpBinding, 並啟用 <enableWebScript/> 的 endPoint behavior
  3. 部署程式到 Windows 2008 的 IIS 7 上。此以瀏覽器輸入網址 *.svc/js 會回傳 404 錯誤
  4. 這一步就是我漏掉的。打開 IIS 管理員,找到該網站(Site),於 "處理常式對應”(Handler Mappings)上,新增一個指令對應。

要求路徑:*.svc
執行檔:%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll
名稱:svc-ISAPI-2.0

       如下圖。

image

這樣一來就解決了問題。

2010年3月25日 星期四

C# 鍵盤對照表

想要開發時增加生產力,一定要了解快速鍵。

請參照 Visual C# 2008 Keyboard Shortcut Reference PosterVisual C# 2005 Keyboard Shortcut Reference Poster

[2010/04/29] 補上 VS 2010 Key binding Card

下載的 pdf 檔,有時真的不知道在說些什麼,因為說明實在太精簡了,而給的範圍也太大了些。此時,知道別的專家都使用哪些快速鍵是個好方法,此時參考 http://stackoverflow.com/questions/98606/favorite-visual-studio-keyboard-shortcuts 。這裡反而是較快上手的地方呢。

最完整的地方,當然還是 msdn 了。

2010年3月18日 星期四

Windows 2000, XP SP2 and Vista 終止技術支援

客戶是老大,但有些事不是出錢就能解決的。

常見的問題,是客戶的平台太舊了,微軟不支援,當然身為廠商的我們,也就難以支援了。畢竟我們使用微軟的技術來支援。

Windows 2000 Professional及Windows 2000 Server版本將於美國時間2010年7月13日停止技術支援服務。
微軟將停止Windows XP SP2版本的安全更新,請您記得安裝更新Windows XP Service Pack 3。
Windows Vista (若沒安裝 任何的 Service Pack的話)將在美國時間2010年4月13日停止技術支援服務,請您記得安裝更新Windows Vista Pack 2 。

一句老話:電腦硬體都會汰舊換新,那軟體的版本當然也會。

2010年2月27日 星期六

程式語言趨勢

長久以來,各家 programming language 都會標榜自家的語言多好,其他語言將如何如何。其實,語言只是工具。語言是否能成為主流,要看大環境、使用的平台、廠商是否支持、原廠是否持續力推等等。

TIOBE Programming Community Index for February 2010 這裡的調查結果發現,Java 仍然是使用率最高的語言。Java 已死的說法不盡然。

我喜歡看趨勢,而非一時的高低。在該資料中,也可發現 Java 長期來,由2001年的 27% 下降到 2010年的17.5%。同一時間的C# 由 0.1% 不斷地上升到 5%, PHP 由 1.5% 上升到 10.0%。若由此觀察,Java 語言不斷地流失市佔率也是事實。

而另一個事實,靜態語言與動態語言的比例趨勢,看來動態語言是大幅提升到了不可忽視,甚至必需學習的地步。到目前為止,動態佔6成,靜態佔4成。由此也可了解微軟後來為何出了 F#語言,支援IronPython, IroRuby等動作。

2010年2月24日 星期三

讀取大型文字檔

以往在讀取文字檔時,會使用 File.ReadAllLines 方法,一次取得所有行。如下

static void Main(string[] args)
{
  string[] lines = File.ReadAllLines("TextFile1.txt");
  foreach (var line in lines)
    Console.WriteLine(line);
}

相當簡單。但這樣的方法,遇到大型文字檔,例如100MB時,就很麻煩了。原因在ReadAllLines 時就會一次將所有的資料讀到 lines 中,可能造成記憶體不足。

在 c# 2.0 時,介紹了 yield 的語法。在 c#3.0 時,介紹了 LINQ 語法。於是上述的問題就可以解了。如下

static void Main(string[] args)
{
  //string[] lines = File.ReadAllLines("TextFile1.txt"); // may need large memory
  var lines = ReadLines("TextFile1.txt");  //not consume large memory
  foreach (var line in lines)
    Console.WriteLine(line);
}

public static IEnumerable<string> ReadLines(string filePath)
{
  using (StreamReader reader = new StreamReader(filePath))
  {
    while (!reader.EndOfStream)
      yield return reader.ReadLine();
  }
}

上述的寫法很好。適合寫成常用的 framework! 因此,在 .net framework 4.0 中,已經將該段程式新增為 File.ReadLines

static void Main(string[] args)
{
  //string[] lines = File.ReadAllLines("TextFile1.txt"); // may need large memory
  var lines = File.ReadLines("TextFile1.txt"); // not need large memory, new in .net framework 4.0
  foreach (var line in lines)
    Console.WriteLine(line);
}

 

類似新增的方法,有

File.WriteAllLines, File.AppendAllLines, Directory.EnumerateDirectories, Directory.EnumerateFiles, Directory.EnumerateFileSystemEntries, DirectoryInfo.EnumerateDirectories, DirectoryInfo.EnumerateFiles, DirectoryInfo.EnumerateFileSystemInfos

2010年2月12日 星期五

C# 4.0: dynamic language (3)

前例中,我們使用了 ExpandoObject 做為動態物件,但 ExpandoObject 卻是不可被繼承的(sealed)。前例中的 Show 函式在執行時期被指定的。

   1: dynamic o = new ExpandoObject();
   2: o.Name = "aaa";
   3: o.Id = 3;
   4: o.Show = new Action(() => Console.WriteLine("Id = " + o.Id + ", Name = " + o.Name));
   5: o.Show();

如果,這樣的行為也可以有物件導向的行為就好了。這樣一來,Show函式就是固定的行為,而不是臨時被指定的,畢竟OO的概念在軟體重用上佔了一席之地,也是我們習慣的設計原則了。

於是,DynamicObject 就出現了。DynamicObject 透過繼承,將內部的物件以動態的方式呈現出來。當存取不存在的屬性、方法時,就會呼叫 DynamicObject 的 TrySetMember, TryGetMember, TryInvokeMember 等函式。

以下,就將上例改成 DynamicObject 來實作一次。

   1: class Program
   2: {
   3:   static void Main(string[] args)
   4:   {
   5:     dynamic o = new MyObj();
   6:     o.Name = "aaa";
   7:     o.Id = 3;
   8:     o.Show();
   9:   }
  10: }
  11:  
  12: class MyObj : DynamicObject
  13: {
  14:   Dictionary<string, object> _innerDictionary = new Dictionary<string, object>();
  15:   public override bool TrySetMember(SetMemberBinder binder, object value)
  16:   {
  17:     _innerDictionary[binder.Name] = value;
  18:     return true;
  19:   }
  20:   public void Show()
  21:   {
  22:     Console.WriteLine("Id = " + _innerDictionary["Id"] + ", Name = " + _innerDictionary["Name"]);
  23:   }
  24: }

由新版的例子來看,Show 函式已經是固定的行為了,一定會取得 Name 及 Id 的資料出來顯示。

DynamicObject 在行為了更為奇特,它具有動態物件的特性,卻保有繼承的概念。其實,動態語言也是可以繼承的,只是我們寫靜態語言習慣了,以為繼承是靜態語言的特性罷了。

2010年2月11日 星期四

C# 4.0: dynamic language (2)

Javascript 是一個動態語言。請看下面這一段 script

   1: <script type="text/javascript">
   2:     function Test() {
   3:       var o = new Object();
   4:       o.Name = "aaa";
   5:       o.Id = 3;
   6:       o.Show = function () { alert("Id = " + o.Id + ", Name = " + o.Name) };
   7:       o.Show();
   8:     }
   9:     Test();
  10:   </script>

而 C# 4.0 呢?有沒有相對應的寫法呢?有的!將 var 改成 dynamic,而 Object 改成 ExpandoObject。而沒有回傳值的函數,就是 Action。如下。

   1: static void Main(string[] args)
   2:     {
   3:       dynamic o = new ExpandoObject();
   4:       o.Name = "aaa";
   5:       o.Id = 3;
   6:       o.Show = new Action(() => Console.WriteLine("Id = " + o.Id + ", Name = " + o.Name));
   7:       o.Show();
   8:     }

是不是很類似呢?原來,C# 3.0時, lamda expression 就是採用了動態語言的特性,但使用靜態語言的編譯器就達到了動態語言的效果。

Share with Facebook