Asp.net

物理文件夾破壞 IIS Express 上的 ASP.NET URL 路由

  • August 2, 2013

403.14 Forbidden當原本通過 ASP.NET URL 路由處理的 URL 恰好對應於我的 ASP.NET 項目中的物理文件夾時,IIS Express 會產生錯誤。(文件夾只包含程式碼,巧合的是文件夾名稱恰好與頁面的 URL 匹配;我的 URL 結構是由數據庫動態確定的,使用者可以編輯該結構,所以雖然我可以重命名我的項目文件夾,一般來說,我無法阻止這種碰撞的發生。)

這似乎是因為DirectoryListingModule處理請求的步驟,然後由於目錄瀏覽被禁用而立即失敗。我試過刪除這個:

<system.webServer>
 <handlers>
   <remove name="StaticFile" />
   <add name="StaticFile" path="*" verb="*"
        modules="StaticFileModule" resourceType="Either" requireAccess="Read" />
 </handlers>
</system.webServer>

這將刪除預設StaticFile處理程序配置,它具有modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule",並將其替換為僅提供我想要的功能的配置。(我想要靜態文件服務,但我不需要此應用程序中的目錄列表或預設文件。)但效果似乎是當我點擊時 IIS 會產生一個完全空的(0 字節)響應(狀態為 200)有問題的頁面。

所以接下來,我嘗試將處理程序配置為StaticFile僅處理我想要提供的特定物理文件夾:

<system.webServer>
 <handlers>
   <remove name="StaticFile" />
   <add name="StaticFileCss" path="style/*.css" verb="*"
        modules="StaticFileModule" resourceType="Either" requireAccess="Read" />
   <add name="StaticFileScripts" path="Scripts/*" verb="*"
        modules="StaticFileModule" resourceType="Either" requireAccess="Read" />
 </handlers>
</system.webServer>

但是當我點擊有問題的 URL 時,這會產生一個404.4 - Not found錯誤,並帶有The resource you are looking for does not have a handler associated with it.. (錯誤頁面的詳細錯誤資訊說我們在IIS Web Core模組中,在MapRequestHandler通知期間,處理程序是Not yet determined,並且有一個錯誤程式碼0x80070002,這是一個與Win32錯誤對應的COM HRESULT ERROR_FILE_NOT_FOUND。)

令人費解的是,它甚至都懶得問 ASP.NET 是否有處理它的處理程序。IIS 似乎自己決定絕對沒有處理程序。

僅當存在與 URL 匹配的文件夾時才會發生這種情況。具有動態確定 URL 的所有其他資源都可以正常工作 - IIS 向 ASP.NET 請求處理程序,ASP.NET 的路由機制正常執行,如果 URL 對應於我動態定義的頁面之一,則一切正常。只是物理文件夾的存在阻止了這一切工作。

我可以看到它是 IIS 這樣做的,因為我得到了這個 404 的 IIS 樣式錯誤頁面之一,並且它們具有與 ASP.NET 生成的 404 非常不同的獨特設計。(如果我嘗試導航到既不對應於物理文件夾也不對應於動態資源的 URL,我會得到一個由 ASP.NET 生成的 404 頁面。所以通常情況下,IIS 肯定會將請求移交給 ASP.NET,但 IIS肯定會妨礙這些有問題的資源。)

我嘗試在我的<system.WebServer>.managedHandler

<modules runAllManagedModulesForAllRequests="true">

但這似乎沒有幫助 - 它仍然沒有涉及與物理文件夾對應的 URL 的 ASP.NET 路由。在任何情況下,這都不是最理想的——我不希望託管處理程序為我絕對想作為靜態內容處理的內容執行。我實際上希望將 ASP.NET URL 路由用作後盾——我只希望它在 URL 絕對不引用靜態內容的情況下發揮作用。

我不明白為什麼 ASP.NET 甚至沒有詢問 ASP.NET 在這種情況下的想法。MapRequestHandler如果有一個與 URL 對應的物理文件夾,為什麼在該階段不呼叫 ASP.NET ?

當找到與路由具有相同 URL 的物理文件或文件夾時,路由將不會處理請求並提供物理文件。

您可以通過將 RouteCollection 對像中的**RouteExistingFiles屬性設置為true來更改此行為。

看看MSDN頁面Scenarios when routing is not applied

引用自:https://stackoverflow.com/questions/17611158