2013-01-08 48 views
0

基於此回答:https://stackoverflow.com/a/2066040/458354我有一個web.config,它爲子目錄中的所有文件定義了一個自定義HttpHandler,放置在我的靜態文件子目錄中。如果該目錄(即使配置爲虛擬目錄)與IIS位於同一臺服務器上,則此功能可以很好地工作。但是,如果虛擬目錄指向另一臺服務器上的共享文件夾,則在訪問靜態資源時收到此錯誤:「加載配置文件時發生錯誤:文件監視的文件名無效:'\\ remoteserver \ remotedir \ web的.config」。」遠程虛擬目錄中的web.config

我甚至已經將遠程目錄的權限授予了來自web服務器的IIS_IUSR。我懷疑問題是配置路徑是一個共享。有什麼想法讓虛擬目錄web.config被IIS讀取?

或者,有沒有辦法在站點的普通web.config中配置處理程序路徑來覆蓋整個子目錄?

配置線問題:

<add name="MyRequestHandler" type="MyApp.StaticFileRequestHandler, 
MyApp" path="*" resourceType="Either" verb="GET,HEAD" 
requireAccess="Read"/> 
+0

實際上,遠程共享中的配置文件訪問得很好。我已將問題縮小到「路徑」值。如果只是通配符或請求的擴展名,則會引發錯誤,但如果路徑是未請求的特定擴展名,則不會發生此錯誤... – mdisibio

+0

設置正常。似乎是AppPool身份的權限問題,如[http://stackoverflow.com/q/10354748/458354](http://stackoverflow.com/q/10354748/458354)中所述。將ApplicationPool身份設置爲用於連接到遠程虛擬目錄的同一身份,可以使處理程序按預期運行子目錄。給連接用戶權限的目錄是不夠的處理程序。 – mdisibio

回答

0

401 Unauthorized when custom IHttpHandler tries to read from virtual directory。將ApplicationPool標識設置爲將用於連接到遠程虛擬目錄(例如可能是服務帳戶)的相同標識。

此外,關於將Handler分配給子目錄的替代方法,我最終更改了應用程序設計以使用asp.net路由(而不是MVC),並讓url請求通過標識符指定了所需的靜態文件這可能並不總是可取的,但在我們的應用領域其他地方已經是一種現有的做法)。這消除了在虛擬目錄孩子的web.config的需要,因爲處理程序就可以通過編程的方式分配:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    // fileId must be all digits, with at least one digit 
    var routeConstraints = new RouteValueDictionary { { "fileId", @"\d{1,}" } }; 
    var getProtectedFileRoute = new Route("resources/files/{fileId}", new MyFileRequestRouteHandler()) 
    { 
     Constraints = routeConstraints 
    }; 
    routes.Add(getProtectedFileRoute); 
} 

標識符不再是一個通配符,但RouteData參數。 (不知道這是否會工作,如果標識符是一個'點'和擴展名的文件名...)。