ASP.NET MVC 5如何正確加入robots.txt?

ASP.NET MVC 5如何正確加入robots.txt?

robots.txt

圖片: http://blogtimenow.com

各位都知道ASP.NET MVC Framework從一開始就是走「路由(Routing)」機制,它並不是使用如ASP.NET (WebForms)的實體路徑+實體檔案的對應方式,所以要如何做才能加入robots.txt?

習慣性之Google之路

對於不知道的事物,我相信大家的第一選擇就是求Google大神幫忙。

關鍵字:mvc robots.txt

哇,有一堆的答案,都已經ASP.NET MVC 5了,這問題應該早就已經是FAQ級的問題了吧?

處理方式有二:

  • "robots.txt" Routing + ViewResult
  • "robots.txt" Routing + FileResult

"robots.txt" Routing 意指設置一條 url: "robots.txt",然後利用 default: 指到預設的 {controller}/{action},由此來回應 robots.txt 的內容。

ViewResult 是利用 View Page 來回應 robots.txt 內容。File 是利用資料流來回應 robots.txt 的內容。以效率而言,File沒有 Disk I/O 成本,是比較好的的方式,所以我最後選用File來回應 robots.txt 的內容。

以上透過一條假路由方式來模擬根目錄下的 robots.txt。

網路上的教學都還會特別提到一條 web.config 的設置:<modules runAllManagedModulesForAllRequests="true"></modules>,由 iis.net 文件中可以看到以下說明:

Optional Boolean value.

True if all managed modules can process all requests, even if the request was not for managed content; otherwise, false.

Note: In ASP.NET websites, the value of runAllManagedModulesForAllRequests previously had to be set to true to support routing. However, once IIS 7 has been updated with a Service Pack, the value of runAllManagedModulesForAllRequests can be set to false or omitted when working with ASP.NET routing. For more information, see ASP.NET Routing on the MSDN website.

The default value is false.

也就是說從 IIS 7 開始(更正確是指某個 Service Pack,我沒細查,文件也沒寫),為了支援 ASP.NET Routing ,runAllManagedModulesForAllRequests 預設會修改為 false,如果 web.cofing 沒有加上去,那麼你會得到一個 HTTP 404 錯誤。但這樣好嗎?

OzCode - 最強大的 Visual Studio 偵錯套件

OzCode - 最強大的 Visual Studio 偵錯套件

我們都知道Visual Studio是地表最強的開發工具,其中與開發人員最相關的二個功能是開發時的IntelliSense與除錯用的IntelliTrace,IntelliTrace雖然強大好用,但是要Ultimate版才有完善支援,當然,那是一筆不小的費用。那麼除了升級為Ultimate版本外,是否還有其他好的選擇?是的,OzCode就是一套筆者要介紹給各位的Visual Studio Debug擴充程式。

OzCode

好的除錯工具帶你上天堂。OzCode是一套可以解決除錯上煩腦的強大套件。

OzCode正在舉辦一個除錯測試,參加者有機會贏得一套OzCode授權,以下範例以除錯測試中的範例來示範,讓各位讀者看看使用OzCode的前後差異。

OzCode Challenge

第一題

void Main()
{
 bool flag = true;
 StringBuilder sb = new StringBuilder();
 sb.Append("foo " + flag == false + " Bar");
 Console.WriteLine (sb.ToString());
}   
  
OzCode 第一題

LINQPad執行結果是false,但是why?

我們看看在Visual Studio下使用IntelliTrace的結果:

IntelliTrace-1
IntelliTrace-2

雖然對於變數內容的變化,我們可以很容易的透過區域變數視窗來觀察,但對於運算式的運算過程IntelliTrace就比較幫不上忙。我們還是只知道結果是false,但為何是false還是有看沒有懂。

第二題

void Main()
{
 var riddle = new Riddle();
 ((Counter)riddle.counter).Increment();
 Console.WriteLine (((Counter)riddle.counter).Count);
}

// Define other methods and classes here
struct Counter
{
 private int x;
 public void Increment() { this.x++; }
 public int Count { get { return this.x; } }
}

class Riddle
{
 public readonly object counter = new Counter();
}   
  
OzCode 第二題
IntelliTrace-3

執行結果為0,但為什麼為是0呢?

第三題

void Main()
{
 bool boolean1 = true;
 bool boolean2 = true;
 bool boolean3 = false;
 
 if (boolean1 = boolean2 && boolean3)
  Console.WriteLine ("true");
 else
  Console.WriteLine ("false");
}   
  
OzCode 第三題

執行結果為false