C#ASP.NET MVC2路由通用处理程序

C#ASP.NET MVC2路由通用处理程序,c#,asp.net-mvc-2,routing,generic-handler,C#,Asp.net Mvc 2,Routing,Generic Handler,也许我在寻找错误的东西,或者试图以错误的方式实现它。我正在使用通用处理程序动态生成一个图像。我当前可以使用以下方式访问我的处理程序: ImageHandler.ashx?width=x&height=y 我更愿意使用类似的方式访问我的处理程序 images/width/height/imagehandler 这有可能吗?我在谷歌上找到的几个例子都不适用于MVC2 干杯。我昨晚继续研究这个问题,令我惊讶的是,我离我所想的解决方案更近了。对于将来可能遇到这种情况的人,我将介绍如何将MVC

也许我在寻找错误的东西,或者试图以错误的方式实现它。我正在使用通用处理程序动态生成一个图像。我当前可以使用以下方式访问我的处理程序:

ImageHandler.ashx?width=x&height=y
我更愿意使用类似的方式访问我的处理程序

images/width/height/imagehandler
这有可能吗?我在谷歌上找到的几个例子都不适用于MVC2


干杯。

我昨晚继续研究这个问题,令我惊讶的是,我离我所想的解决方案更近了。对于将来可能遇到这种情况的人,我将介绍如何将MVC2路由实现为通用处理程序

首先,我创建了一个继承IRoutHandler的类

public class ImageHandlerRouteHandler : IRouteHandler
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        var handler = new ImageHandler();
        handler.ProcessRequest(requestContext);

        return handler;
    }
}
然后,我实现了通用处理程序,创建了一个MVC友好的ProcessRequest

public void ProcessRequest(RequestContext requestContext)
{
    var response = requestContext.HttpContext.Response;
    var request = requestContext.HttpContext.Request;

    int width = 100;
    if(requestContext.RouteData.Values["width"] != null)
    {
        width = int.Parse(requestContext.RouteData.Values["width"].ToString());
    }

    ...

    response.ContentType = "image/png";
    response.BinaryWrite(buffer);
    response.Flush();
}
然后将路由添加到global.asax

RouteTable.Routes.Add(
    new Route(
        "images/{width}/{height}/imagehandler.png", 
        new ImageShadowRouteHandler()
    )
 );
然后,您可以使用

<img src="/images/100/140/imagehandler.png" />

我使用通用处理程序在需要时生成动态水印。希望这能帮助其他人


如果您有任何问题,请告诉我,我会尽力帮助您。

我昨晚继续研究这个问题,令我惊讶的是,我离我所想的解决方案更近了。对于将来可能遇到这种情况的人,我将介绍如何将MVC2路由实现为通用处理程序

首先,我创建了一个继承IRoutHandler的类

public class ImageHandlerRouteHandler : IRouteHandler
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        var handler = new ImageHandler();
        handler.ProcessRequest(requestContext);

        return handler;
    }
}
然后,我实现了通用处理程序,创建了一个MVC友好的ProcessRequest

public void ProcessRequest(RequestContext requestContext)
{
    var response = requestContext.HttpContext.Response;
    var request = requestContext.HttpContext.Request;

    int width = 100;
    if(requestContext.RouteData.Values["width"] != null)
    {
        width = int.Parse(requestContext.RouteData.Values["width"].ToString());
    }

    ...

    response.ContentType = "image/png";
    response.BinaryWrite(buffer);
    response.Flush();
}
然后将路由添加到global.asax

RouteTable.Routes.Add(
    new Route(
        "images/{width}/{height}/imagehandler.png", 
        new ImageShadowRouteHandler()
    )
 );
然后,您可以使用

<img src="/images/100/140/imagehandler.png" />

我使用通用处理程序在需要时生成动态水印。希望这能帮助其他人


如果您有任何问题,请告诉我,我将尽可能帮助您。

我使用该解决方案已有很长一段时间,您可以将其设置为通用解决方案,以便它可以接受您将来使用的任何处理程序:

internal class RouteGenericHandler<T> : IRouteHandler where T : IHttpHandler, new()
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        return new T();
    }
}
内部类RouteGenericHandler:IRouteHandler其中T:IHttpHandler,new()
{
公共IHttpHandler GetHttpHandler(RequestContext RequestContext)
{
返回新的T();
}
}
在RegisterRoutes方法上:

routes.Add(new Route("Name", new RouteGenericHandler<TestHandler>()));
routes.Add(新路由(“Name”,newroutegenerichandler());

我使用该解决方案已有很长一段时间了,您可以将其设置为通用解决方案,以便它可以接受您将来使用的任何处理程序:

internal class RouteGenericHandler<T> : IRouteHandler where T : IHttpHandler, new()
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        return new T();
    }
}
内部类RouteGenericHandler:IRouteHandler其中T:IHttpHandler,new()
{
公共IHttpHandler GetHttpHandler(RequestContext RequestContext)
{
返回新的T();
}
}
在RegisterRoutes方法上:

routes.Add(new Route("Name", new RouteGenericHandler<TestHandler>()));
routes.Add(新路由(“Name”,newroutegenerichandler());

太棒了。这对我有用。唯一的问题是,在添加到Global.asax的代码中,您提到ImageShadowRouteHandler时,它应该是ImageHandlerRouteHandler,这是一个非常好的解决方案。我喜欢它,因为我不需要管理控制器的遗留处理程序的代码。太棒了。这对我有用。唯一的问题是,在添加到Global.asax的代码中,您提到ImageShadowRouteHandler时,它应该是ImageHandlerRouteHandler,这是一个非常好的解决方案。我喜欢它,因为我不需要管理遗留处理程序到控制器的代码。