2013-07-12 40 views
8

IIS Express đang sản xuất lỗi 403.14 Forbidden khi một URL mà nếu không sẽ được xử lý thông qua định tuyến ASP.NET URL xảy ra tương ứng với một thư mục vật lý trong dự án ASP.NET của tôi. (Thư mục chỉ chứa mã và trùng hợp tên thư mục sẽ khớp với URL của trang, cấu trúc URL của tôi được xác định động bởi cơ sở dữ liệu và người dùng có thể chỉnh sửa cấu trúc đó, vì vậy mặc dù tôi có thể đổi tên thư mục dự án của mình, nói chung tôi không thể ngăn chặn loại xung đột xảy ra.)Physical Folder Breaks ASP.NET URL Routing trên IIS Express

Điều này dường như đang xảy ra vì các bước DirectoryListingModule để xử lý yêu cầu, và sau đó nhanh chóng thất bại vì trình duyệt thư mục bị tắt. Tôi đã cố gắng loại bỏ này:

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

Đó loại bỏ các cấu hình xử lý mặc định StaticFile, trong đó có modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule", và thay thế nó bằng một cấu hình mà chỉ cung cấp các tính năng tôi muốn. (Tôi muốn phục vụ tệp tĩnh, nhưng tôi không cần danh sách thư mục hoặc tài liệu mặc định trong ứng dụng này.) Nhưng hiệu ứng dường như là IIS sau đó tạo ra phản hồi hoàn toàn trống (0 byte) (với trạng thái 200) khi tôi nhấn trang vi phạm.

Vì vậy, hôm sau, tôi đã cố gắng cấu hình xử lý StaticFile để xử lý chỉ các thư mục vật lý cụ thể mà tôi muốn làm cho có sẵn:

<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> 

Nhưng khi tôi nhấn URL vi phạm, điều này sau đó tạo ra một lỗi 404.4 - Not found, với một thông điệp của The resource you are looking for does not have a handler associated with it.. (Thông tin lỗi chi tiết trên trang lỗi nói rằng chúng tôi đang ở trong mô-đun IIS Web Core, trong thông báo MapRequestHandler, trình xử lý là Not yet determined và có Mã lỗi 0x80070002, là một COM HRESULT tương ứng với lỗi Win32 ERROR_FILE_NOT_FOUND.)

Điều bí ẩn là thậm chí không cần hỏi ASP.NET liệu nó có trình xử lý cho nó hay không. IIS dường như đang tự quyết định rằng chắc chắn không phải là một trình xử lý.

Điều này chỉ xảy ra khi có thư mục khớp với URL. Tất cả các tài nguyên khác với các URL được xác định động chỉ hoạt động tốt - IIS yêu cầu ASP.NET cho trình xử lý, cơ chế định tuyến của ASP.NET chạy như bình thường và nếu URL tương ứng với một trong các trang được xác định động của tôi, tất cả đều hoạt động tốt. Nó chỉ là sự hiện diện của một thư mục vật lý mà dừng tất cả điều này từ làm việc.

Tôi có thể thấy IIS đang thực hiện điều này vì tôi nhận được một trong các trang lỗi kiểu IIS cho 404 này và chúng có thiết kế đặc biệt khác với 404 do ASP.NET sản xuất. (Nếu tôi cố gắng điều hướng đến một URL không tương ứng với một thư mục vật lý, cũng như một tài nguyên động, tôi sẽ nhận được một trang 404 do ASP.NET tạo ra. Vì vậy, thông thường, IIS chắc chắn đang chuyển yêu cầu tới ASP.NET, nhưng IIS . chắc chắn nhận được trong đường cho các nguồn lực này có vấn đề)

tôi đã thử thêm này bên <system.WebServer> của tôi, trong trường hợp các vấn đề đã được rằng IIS đã quyết định rằng các yêu cầu tương ứng với thư mục vật lý không đáp ứng được managedHandler điều kiện tiên quyết:

<modules runAllManagedModulesForAllRequests="true"> 

Nhưng điều đó dường như không giúp đỡ - nó vẫn không nhận được định tuyến ASP.NET liên quan đến các URL tương ứng với các thư mục vật lý. Trong mọi trường hợp, nó sẽ được tối ưu hóa - tôi không muốn có trình xử lý được quản lý chạy cho nội dung mà tôi chắc chắn muốn xử lý như nội dung tĩnh. Tôi có hiệu quả muốn ASP.NET URL định tuyến được sử dụng như một backstop - Tôi chỉ muốn nó để đi vào chơi nếu URL chắc chắn không đề cập đến nội dung tĩnh.

Tôi không hiểu tại sao ASP.NET thậm chí không hỏi ASP.NET những gì nó nghĩ trong kịch bản này. Tại sao nó không gọi vào ASP.NET trong giai đoạn MapRequestHandler nếu có một thư mục vật lý xảy ra tương ứng với URL?

Trả lời

3

Khi một tệp hoặc thư mục vật lý có cùng URL với tuyến đường được tìm thấy, các tuyến đường sẽ không xử lý yêu cầu và tệp vật lý sẽ được phân phối.

Althrough bạn có thể thay đổi hành vi này bằng cách thiết lập RouteExistingFiles Property từ đối tượng RouteCollection để đúng.

Hãy xem trang MSDN Scenarios when routing is not applied

Các vấn đề liên quan