2013-07-12 26 views
8

當Express URL可能通過ASP.NET URL路由處理碰巧與我的ASP.NET項目中的物理文件夾相對應時,IIS Express正在生成403.14 Forbidden錯誤。 (這個文件夾只包含代碼,而巧合的是文件夾名稱恰好與頁面的URL匹配;我的URL結構是由數據庫動態確定的,用戶可以編輯該結構,儘管我可以重命名我的項目文件夾,通常我不能阻止這種衝突的發生。)物理文件夾斷開IIS Express上的ASP.NET 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,這是一個COM HRESULT,對應於Win32 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>內,以防問題是,IIS已經決定,對應物理文件夾的請求不符合managedHandler前提:

<modules runAllManagedModulesForAllRequests="true"> 

但這似乎沒有幫助 - 它仍然沒有獲得對應於物理文件夾的URL的ASP.NET路由。在任何情況下,這都不是最理想的 - 我寧願不讓託管處理程序運行我確實想要作爲靜態內容處理的內容。我實際上希望將ASP.NET URL路由用作反向支持 - 我只希望它能在URL無法引用靜態內容時發揮作用。

我不明白爲什麼ASP.NET甚至沒有問ASP.NET它在這種情況下認爲。爲什麼在MapRequestHandler階段,如果有一個碰巧與URL對應的物理文件夾,它不會調用到ASP.NET中?

回答

3

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

g雖然你可以從RouteCollection對象設置RouteExistingFiles物業真正更改此行爲。

看看MSDN頁面Scenarios when routing is not applied