2008-11-17 97 views
10

我們對ASP.NET自定義REST處理程序被配置這樣來處理所有傳入的請求:ASP.NET URL驗證

<add path="*" verb="*" type="REST.RESTProtocolHandler"/> 

然而,傳遞一個管道字符,編碼正確或完全不,觸發驗證錯誤,似乎來自ASP.NET內部。

訪問http://localhost:8080/%7chttp://localhost:8080/|產生這個錯誤:

[ArgumentException: Illegal characters in path.] System.IO.Path.CheckInvalidPathChars(String path) +7489125 System.IO.Path.Combine(String path1, String path2) +40 System.Web.Configuration.UserMapPath.GetPhysicalPathForPath(String path, VirtualDirectoryMapping mapping) +114 System.Web.Configuration.UserMapPath.GetPathConfigFilename(String siteID, VirtualPath path, String& directory, String& baseName) +72 System.Web.Configuration.UserMapPath.MapPath(String siteID, VirtualPath path) +30 System.Web.Configuration.UserMapPath.MapPath(String siteID, String path) +31 System.Web.Hosting.HostingEnvironment.MapPathActual(VirtualPath virtualPath, Boolean permitNull) +297 System.Web.Hosting.HostingEnvironment.MapPathInternal(VirtualPath virtualPath, Boolean permitNull) +51 System.Web.CachedPathData.GetConfigPathData(String configPath) +341 System.Web.CachedPathData.GetVirtualPathData(VirtualPath virtualPath, Boolean permitPathsOutsideApp) +110 System.Web.HttpContext.GetFilePathData() +36 System.Web.HttpContext.GetConfigurationPathData() +26 System.Web.Configuration.RuntimeConfig.GetConfig(HttpContext context) +43 System.Web.Configuration.CustomErrorsSection.GetSettings(HttpContext context, Boolean canThrow) +41 System.Web.HttpResponse.ReportRuntimeError(Exception e, Boolean canThrow, Boolean localExecute) +101 System.Web.HttpRuntime.FinishRequest(HttpWorkerRequest wr, HttpContext context, Exception e) +383

沒有用戶級代碼得到執行。這是一個配置選項嗎?轉載於IIS 7 & VS Studio的2008開發服務器。

堆棧溢出似乎處理這個錯誤好吧,它看起來像一個動態生成的404 MVC頁面獲取呈現爲https://stackoverflow.com/%7c

任何想法?

回答

-1

默認情況下,IIS不允許URL中的某些字符,並認爲它們是非法的。這是你問題的來源 - 它甚至不會調用你的處理程序。據我所知,沒有地方可以配置通過UI接受哪些字符,Windows註冊表除外。我不知道你爲什麼要使用管道,但我不認爲這是好的做法。至於錯誤頁面 - you can always have your own error page對於任何異常,以便用戶看不到醜陋的消息。

+0

如果你看看http://stackoverflow.com/%7c,你會看到你收到一個渲染頁面(你的用戶名是一個提示),所以必須有一種方法來做到這一點。 – bh213 2008-11-17 15:18:44

1

嘗試攔截Global.asax文件中的異常。實施有(Global.asax.cs中)這個方法:

protected void Application_Error(Object sender, EventArgs e) 
{ 
    Exception ex = Server.GetLastError(); 
    //do whatever you want with that exception 
    //or get the url from the context, reformat and redirect 
} 
+0

這就是我第一次看到這篇文章時想到的,但是當我嘲笑它時,它似乎不起作用。 – 2008-11-19 15:27:40

0

我有一個類似的程序,攔截所有與管道想它給了我同樣的錯誤。我認爲它必須在IIS知道誰來處理請求之前進行路徑測試(mappath)。 你的處理程序需要根(意味着所有的調用),但我認爲IIS的方式是通用的。

因此,我認爲任何或大部分無法在文件系統上使用的路徑字符都會在IIS請求(GET/POST)上失敗。

也許有人知道如何禁用IIS檢查。根據錯誤,它似乎發生之前甚至在你的web.config被讀取,因爲它試圖找到正確的配置?,

也許有可能使用自己的錯誤頁面作爲重定向回你的處理程序?

0

我認爲答案是在你的堆棧跟蹤。該錯誤在System.IO.Path上拋出。CheckInvalidPathChars()調用 - 這不是檢查Url,而是檢查IIS所在的Windows文件系統。這不是管道角色Url非法的情況,但基本上DOS非法。

如果您在IIS嘗試在服務器上查找匹配路徑之前攔截Url,我希望您可以處理此錯誤。這可能在於使用重寫規則或類似的方法來查找並重寫Url中不需要的字符。