代码之家  ›  专栏  ›  技术社区  ›  Peter

自定义httphandler未激发,在ASP.NET MVC应用程序中返回404

  •  12
  • Peter  · 技术社区  · 15 年前

    我不知道这是否是相关的,这是发生在一个MVC网站,但我想我还是会提到它。

    在web.config中,我有以下行:

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

    在网站项目中,我有一个名为handlers的文件夹,其中包含我的ImageHandler类。看起来像这样(我已经删除了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; }
            }
        }
    }
    

    如果我运行我的网站并转到/something.imu,它只会返回404错误。

    我正在使用Visual Studio 2008并尝试在ASP.NET开发服务器上运行它。

    我找了好几个小时,让它在一个单独的空网站上工作。所以我不明白为什么它不能在现有的网站内工作。没有其他对*.imu路径btw的引用。

    1 回复  |  直到 13 年前
        1
  •  32
  •   samjudson    13 年前

    我怀疑这一切都与您使用MVC的事实有关,因为它基本上控制所有传入的请求。

    我怀疑您必须使用路由表,并可能创建一个新的路由处理程序。我自己也没做过,但像这样的事情可能会奏效:

    void Application_Start(object sender, EventArgs e) 
    {
        RegisterRoutes(RouteTable.Routes);
    }
    
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.Add(new Route
        (
             "{action}.imu"
             , new ImageRouteHandler()
        ));
    }
    

    然后 ImageRouteHandler 然后类将返回您的自定义 ImageHttpHandler 尽管从Web上的示例来看,最好更改它以便实现 MvcHandler 而不是笔直的 IHttpHandler .

    编辑1:根据Peter的评论,您也可以使用 IgnoreRoute 方法:

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