2012-06-29 31 views
17

Tôi đã googling và mày mò trong một vài giờ và đã không thực sự tiến bộ nhiều, vì vậy hy vọng ai đó ở đây có thể giúp đỡ.ASP.NET MVC Route: bỏ qua staticfile handler cho đường dẫn

Tôi đang cố gắng nhận tất cả các yêu cầu tới một đường dẫn nhất định sẽ được xử lý bởi thành phần của bên thứ 3.

EDIT Và tôi cần tất cả các yêu cầu cho tất cả các đường dẫn khác hoạt động bình thường.

Tôi đang sử dụng một trình xử lý đường với một ánh xạ ký tự đại diện như thế này:

routes.Add(new Route("pathiwant/{*EverythingElse}", new MyRouteHandler())); 

Tất cả các tuyến đường truyền thống về phía trước một cách chính xác để xử lý, mà sẽ chuyển độc đáo với thành phần bên thứ 3. Khi tôi nhấn các tệp tĩnh (.html, .txt, v.v.), chúng được trình xử lý StaticFile chọn thay vì trình xử lý của tôi, vì vậy tôi đang cố tắt trình xử lý StaticFile như vậy (đơn giản):

<system.webServer> 
    <handlers> 
    <remove name="StaticFile"/> 
    </handlers> 
</system.webServer> 

Điều này sẽ tắt trình xử lý StaticFile, nhưng MVC vẫn không nhận tuyến đường.

Tôi không muốn quay trở lại việc tạo trình xử lý của riêng mình và đưa vào ngăn xếp yêu cầu ASP vì có vẻ như phải có cách MVC vui vẻ để thực hiện việc này.

Mọi suy nghĩ? Và cảm ơn.

Trả lời

14

Có một vài tùy chọn tại đây.

http://www.hanselman.com/blog/BackToBasicsDynamicImageGenerationASPNETControllersRoutingIHttpHandlersAndRunAllManagedModulesForAllRequests.aspx

Nếu bạn thực sự muốn tất cả các yêu cầu chạy qua các ống asp.net thì bạn cần.

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
</system.webServer> 

Cập nhật

Một lựa chọn khác, đặc biệt là nếu nhu cầu của bạn để vượt qua các handler tĩnh được hạn chế đến một tập hợp con của trang web của bạn, là sử dụng sau

<add name="ApiURIs-ISAPI-Integrated-4.0" 
    path="/subdirectory/*" 
    verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" 
    type="System.Web.Handlers.TransferRequestHandler" 
    preCondition="integratedMode,runtimeVersionv4.0" /> 

Xét như thế nào về Các trang web mvc, hầu hết các tệp tĩnh được xử lý từ một vài thư mục nổi tiếng, đây là một tùy chọn tốt hơn.

+0

Cảm ơn. Nó chắc chắn là một cái gì đó tôi đã cố gắng, nhưng tôi muốn tất cả các con đường khác để được xử lý bình thường. Nó thực sự bắt đầu có vẻ như không có một cách MVC để làm điều này, và tôi nên chỉ cần phá vỡ và thêm xử lý trước khi MVC. – jmoss

+0

Không chắc chắn về các chi tiết cụ thể của chính xác những gì bạn muốn và không muốn xử lý, nhưng có, để xử lý mọi thứ trong mvc ống asp.net cần phải nhận được tất cả các yêu cầu thích hợp. –

+0

LƯU Ý QUAN TRỌNG: '' chỉ áp dụng cho các nhóm ứng dụng đang chạy Đường ống chế độ tích hợp. Điều này sẽ không hoạt động đối với các hồ bơi ứng dụng đang chạy trong chế độ Cổ điển. – BenSwayne

2

Giải pháp tốt nhất cho việc này có thể là sử dụng một số URL Rewriter để ủy quyền các yêu cầu từ URL ban đầu sang một phương thức thay thế thân thiện với MVC.

Ví dụ: giả sử bạn cần có khả năng tự động tải các URL tương đối trong nội dung được phân phối từ cơ sở dữ liệu.

RewriteRule ^/load/(\d+)/rel(\?.*)? - [L] 
RewriteRule ^/load/(\d+)/(.*)$ /load/$1/rel?path=$2 [P,QSA,L,NC] 

Những quy tắc này sẽ cho phép bạn thiết lập hai tuyến đường MVC:

routes.MapRoute(
    "Load Item", 
    "load/{itemId}", 
    new { controller = "Load", action = "Index" } 
    ); 

routes.MapRoute(
    "Load Relative Item", 
    "load/{itemId}/rel", //?path= 
    new { controller = "Load", action = "Relative" } 
    ); 

Và sau đó phương pháp hành động của bạn là đơn giản:

public ActionResult Index(int itemId) { ... } 

public FileStreamResult Relative(int itemId, string path) { ... } 

Nguyên tắc viết lại đầu tiên là có để ngăn chặn đường dẫn chứa/rel từ được viết lại; chúng đã ở dạng cuối cùng. Các proxy quy tắc viết lại thứ hai (thay vì chuyển hướng) yêu cầu.

ví dụ:

/load/1234/file.xml 

trở thành

/load/1234/rel?path=file.xml 

proxy yêu cầu thay vì làm một chuyển hướng khách hàng cho phép đường dẫn tương đối lồng nhau để làm việc tốt (và ẩn sốt bí mật từ người dùng cuối.)

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