C # ASP.NET MVC2 - универсальный обработчик маршрутизации - PullRequest
0 голосов
/ 30 октября 2010

Возможно, я ищу не то или пытаюсь реализовать это неправильно.Я динамически генерирую изображение, используя универсальный обработчик.В настоящее время я могу получить доступ к своему обработчику, используя:

ImageHandler.ashx?width=x&height=y

Я бы предпочел получить доступ к своему обработчику, используя что-то вроде

images/width/height/imagehandler

Возможно ли, что несколько примеров, которые я нашел в Google, не работалис MVC2.

Приветствия.

Ответы [ 2 ]

5 голосов
/ 31 октября 2010

Я продолжал работать над этой проблемой прошлой ночью, и, к своему удивлению, я был ближе к решению, которое я думал.Для тех, кто может бороться с этим в будущем, вот как я реализовал MVC2 Routing to Generic Handler.

Сначала я создал класс, который унаследовал IRouteHandler

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

Я использовал универсальный обработчик для генерации динамических водяных знаков, когда это необходимо.Надеюсь, это поможет другим.

Если у вас есть какие-либо вопросы, дайте мне знать, и я постараюсь помочь вам, где это возможно.

0 голосов
/ 20 марта 2015

Я давно использую это решение, вы можете сделать его универсальным, чтобы оно принимало любой обработчик, который у вас будет в будущем:

internal class RouteGenericHandler<T> : IRouteHandler where T : IHttpHandler, new()
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        return new T();
    }
}

И по методу RegisterRoutes:

routes.Add(new Route("Name", new RouteGenericHandler<TestHandler>()));
...