2009年11月18日 星期三

Asp.Net: File does not exist

在幫別人除錯 asp.net 時,發生了如下的錯誤。

Type : System.Web.HttpException, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Message : File does not exist.
Source : System.Web
Help link :
ErrorCode : -2147467259
Data : System.Collections.ListDictionaryInternal
TargetSite : System.IO.FileInfo GetFileInfo(System.String, System.String, System.Web.HttpResponse)
Stack Trace :    at System.Web.StaticFileHandler.GetFileInfo(String virtualPathWithPathInfo, String physicalPath, HttpResponse response)
   at System.Web.StaticFileHandler.ProcessRequestInternal(HttpContext context)
   at System.Web.DefaultHttpHandler.BeginProcessRequest(HttpContext context, AsyncCallback callback, Object state)
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

但,這是如何發生的呢?並沒有指明是哪一個 page 發生錯誤。

首先,這是有故事的。
我幫同事做了 exception 的 log,也就是發生錯誤時會例外資訊記錄到檔案上。後來發現只要登入後,一到網站首頁,記錄檔就會看到這樣的錯誤資訊。

再來,我發現該專案是使用 Web Development Server 開發的,而不是使用 IIS。這一點我一直不信任 Web Development Server,因為該模式是使用開發人員的權限,而不是真正的 IIS 的權限。未來在正式機器上部署後,還會有權限不正確的變數。

更奇妙的是,我發現只有使用 Web Development Server 才會發生這種現象,而host 在IIS 時是不會發生的。

最後,我在記錄的 handler 上,再寫出HttpContext.Current.Request.FilePath 。令人不解的是,FilePath 竟然是 “/images/default_12.jpg”!!

我的解讀如下:

當使用 IIS 6.0 時,IIS 一遇到 jpg 檔時,就直接找 jpg 檔案後輸出。所有過程與 asp.net 無關。

而使用 Web Development Server , 則所有的檔案皆使用 asp.net 來處理。當遇到 jpg 檔時,會使用 StaticFileHandler 來處理。

因此,不要使用 Web Development Server 來開發。因為畢竟與 IIS 的運作不一樣。

沒有留言:

Share with Facebook