2009-05-14 26 views
12

Tôi không biết liệu nó có liên quan đến điều này đang xảy ra trên trang web MVC hay không nhưng tôi vẫn đề cập đến nó.Tùy chỉnh HttpHandler không kích hoạt, trả lại 404 trong Ứng dụng ASP.NET MVC

Trong web.config của tôi, tôi có những dòng này:

<add verb="*" path="*.imu" type="Website.Handlers.ImageHandler, Website, Version=1.0.0.0, Culture=neutral" /> 

trong dự án website Tôi có một thư mục có tên Handlers chứa lớp ImageHandler tôi. Có vẻ như thế này (tôi đã xóa mã processrequest)

using System; 
using System.Globalization; 
using System.IO; 
using System.Web; 

namespace Website.Handlers 
{ 
    public class ImageHandler : IHttpHandler 
    { 
     public virtual void ProcessRequest(HttpContext context) 
     { 
      //the code here never gets fired 
     } 

     public virtual bool IsReusable 
     { 
      get { return true; } 
     } 
    } 
} 

Nếu tôi chạy trang web của mình và truy cập /something.imu, nó chỉ trả về lỗi 404.

Tôi đang sử dụng Visual Studio 2008 và cố gắng chạy trên máy chủ phát triển ASP.Net.

Tôi đã tìm kiếm vài giờ và làm việc trong một trang web trống riêng biệt. Vì vậy, tôi không hiểu tại sao nó sẽ không hoạt động bên trong một trang web hiện có. Không có tham chiếu nào khác tới đường dẫn * .imu btw.

Trả lời

32

Tôi nghi ngờ rằng điều này có tất cả mọi thứ để làm với thực tế là bạn đang sử dụng MVC, về cơ bản nó kiểm soát tất cả các yêu cầu gửi đến.

Tôi nghi ngờ bạn sẽ phải sử dụng bảng định tuyến và có thể tạo trình xử lý định tuyến mới. Tôi đã không làm điều này bản thân mình nhưng một cái gì đó như thế này có thể làm việc:

void Application_Start(object sender, EventArgs e) 
{ 
    RegisterRoutes(RouteTable.Routes); 
} 

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.Add(new Route 
    (
     "{action}.imu" 
     , new ImageRouteHandler() 
    )); 
} 

và sau đó là lớp ImageRouteHandler sau đó sẽ trở lại tùy chỉnh của bạn ImageHttpHandler, mặc dù từ nhìn vào ví dụ trên web nó có thể là tốt hơn để thay đổi điều đó để nó thực hiện MvcHandler, thay vì thẳng IHttpHandler.

Sửa 1: Theo nhận xét của Phêrô, bạn cũng có thể bỏ qua phần mở rộng bằng cách sử dụng phương pháp IgnoreRoute:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.imu/{*pathInfo}"); 
} 
+4

Whoa đẹp, mà đưa tôi đi đúng hướng! Tôi đã thêm dòng này trong phương thức RegisterRoutes sẽ dừng MVC xử lý yêu cầu: routes.IgnoreRoute ("{resource} .imu/{* pathInfo}"); – Peter

+1

nếu bạn muốn bỏ qua phần mở rộng trong tất cả các đường dẫn, hãy sử dụng route.IgnoreRoute ("{* allimu}", new {allimu = @ ". * \. Imu (/.*)?"}); từ haill phill http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx/ – jsturtevant

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