Как маршрутизировать изображения через маршрутизацию ASP.NET? - PullRequest
7 голосов
/ 18 декабря 2010

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

http://server/images/image.jpg?width=320&height=240

Я попытался настроить маршрут следующим образом:

routes.MapRoute(null,
                "{filename}",
                new { controller = "Image", action = "Resize" });

Но если файл существует по URL-адресу, ASP.NET пропустит маршрутизацию и вернет вам только файл. Как заставить ASP.NET направлять изображения вместо того, чтобы возвращать то, что находится на диске?

Ответы [ 5 ]

4 голосов
/ 18 декабря 2010

Почему бы просто не использовать действие, чтобы сделать это? Действие контроллера может передавать изображение обратно. В противном случае типичный способ, скажем, с ASPX, состоит в том, что обработчик или фабрика обработчиков прослушивает расширение файла и обрабатывает его соответствующим образом. Или используйте перезапись URL, чтобы переписать URL в запросе.

3 голосов
/ 18 декабря 2010

Вот как работает маршрутизация asp.net, это не ускользнет от вас ... вы должны использовать Rewrite, если вы хотите перехватывать запросы для существующих файлов.

Обновление

Похоже, я слишком быстро нажал на курок. Похоже, вы можете установить свойство, которое позволит вам применять маршрут даже для существующих файлов.

Свойство RouteCollection.RouteExistingFiles

http://msdn.microsoft.com/en-us/library/system.web.routing.routecollection.routeexistingfiles.aspx

Получает или задает значение, указывающее, должна ли маршрутизация ASP.NET обрабатывать URL-адреса, соответствующие существующему файлу. True, если маршрутизация ASP.NET обрабатывает все запросы, даже те, которые соответствуют существующему файлу; иначе ложно. Значением по умолчанию является false.

2 голосов
/ 22 февраля 2012

Вы также можете рассмотреть:

  1. Написание модуля для обработки этих маршрутов изображения до того, как он попадет в маршрут (зарегистрирован в Web.Config)
  2. Напишите свой собственный обработчик маршрута специально для обработкиэти изображения.

И то, и другое позволит вам избавиться от необходимости писать в качестве контроллера, я думаю, что это чище.

Очень простой пример вашего собственного обработчика маршрута (из памяти) ...

Зарегистрируйтесь как обычный маршрут:

/* Register in routing */
routes.Add("MyImageHandler",
           new Route("my-custom-url/{folder}/{filename}", 
           new ImageRouteHandler())
);


/* Your route handler */
public class ImageRouteHandler : IRouteHandler
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        string filename = requestContext.RouteData.Values["filename"] as string;
        string folder = requestContext.RouteData.Values["folder"] as string;
        string width = requestContext.HttpContext.Request.Params["w"] as string;
        string height = requestContext.HttpContext.Request.Params["h"] as string;

        // Look up the file and handle and return, etc...
    }
}

Надеюсь, что это поможет.Множество способов расширения и достижения:)

1 голос
/ 18 декабря 2010

Простейшим способом было бы направить все изображения через контроллер и сохранить ваши изображения в отдельном месте.

routes.MapRoute("Images",
            "/images/{filename}",
            new { controller = "Image", action = "Resize" });

/sitebase/images/image.jpg         //public image location
/sitebase/content/images/image.jpg //real image location

Ваш контроллер затем увидит, какое изображение запрашивается, и загрузит соответствующий файл из файла.система.Это позволит вам делать то, что вы хотите, без какой-либо специальной обработки.

0 голосов
/ 02 июля 2011

Как насчет:

routes.MapRoute("Images",
        "/images/{filename}.jpg",
        new { controller = "Image", action = "Resize" });

Это должно гарантировать, что только URL-адреса с расширением .jpg будут соответствовать этому маршруту и ​​маршрутизироваться соответствующим образом.

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

Конечно, вашему действию все еще необходимо обработать изображение с помощью filecontentresult.

...