Обслуживание изображений по тому же пути с маршрутизацией URL в ASP.NET MVC - PullRequest
6 голосов
/ 08 августа 2009

Вот что я хотел бы сделать. У меня есть контент, который я пишу для просмотра. Этот контент имеет ссылки на изображения, относящиеся к документу. Так, например, если я смотрю на следующий URL:

http://localhost/article/8AB98/

Содержимое может иметь изображение в следующей форме:

<img src="myimage.png" />

Это, очевидно, приведет к тому, что браузер запросит изображение по следующему URL:

http://localhost/article/8AB98/myimage.png

Однако из-за маршрутизации mvc это изображение не будет найдено. Знаете ли вы, как можно заставить этот URL-адрес вернуть правильное изображение в браузер?

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

Спасибо !!

Ответы [ 4 ]

6 голосов
/ 08 августа 2009

Вы можете использовать метод Url.Content ().

<img src="<%= Url.Content("~/images/myimage.png") %>" />

Это разрешит URL из корня приложения.

5 голосов
/ 08 августа 2009

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

<img src="myimage.png" />

- это то, что должно быть отображено в браузере, поэтому вам нужно заставить веб-сервер принять URL запроса

.
http://localhost/article/8AB98/myimage.png

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

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

Вариант 1 - перезапись URL

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

Вариант 2 - Пользовательский HttpHandler

Вы могли бы написать HttpHandler, сопоставленный со всеми запросами файла PNG, который анализирует URL-адрес запроса и делает то, что нужно сделать, чтобы найти изображение, а затем вернуть его в поток ответов. Недостатком этого является то, что вам придется указывать IIS для сопоставления всех запросов PNG, чтобы они проходили через aspnet_isapi.dll, что может привести к снижению производительности.

Я все еще не уверен, правильно ли я понимаю вашу проблему, но надеюсь, что это поможет. Удачи.

1 голос
/ 08 августа 2009

Один из способов сделать это - вставить IgnoreRoute для файлов изображений:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("article/{ArticleID}/{name}.png");
    ...
0 голосов
/ 08 августа 2009

Я решил использовать решение @ thinkzig, хотя и немного по-другому. Используя FileContent из сборки MVC Futures, я просто добавил еще один маршрут для обработки изображений.

routes.MapRoute("Image", "article/{id}/{image}", new { controller = "Article", action = "Image" });
routes.MapRoute("Article", "article/{id}", new { controller = "Article", action = "Index" });

Этот новый метод действия просто создает путь к файлу на основе articleID и имени изображения:

public ActionResult Image(string id, string image)
{
    string articlePath = Server.MapPath("~/views/article/");
    string filePath = Path.Combine(articlePath, string.Format("{0}/{1}", id, image));
    return this.File(filePath, "image");
}

Была еще одна маленькая вещь, с которой мне пришлось бороться. Если пользователь получает доступ к статье без косой черты (http://localhost/article/8AB98), то браузер считает, что articleID - это файл, и пытается найти папку с неправильным изображением (http://localhost/article/img.png).

К счастью, в этом случае mvc направляет запрос к действию Article с именем изображения в качестве параметра «id», поэтому я могу просто искать «.» в id, а затем используйте обычное действие Image для его обработки.

в статье Действие:

if (id.Contains("."))
{
    return RedirectToImage(id);
}

А затем код перенаправления изображения, который определяет идентификатор и имя файла

private ActionResult RedirectToImage(string id)
{
    if (Request.UrlReferrer == null)
    {
        return Content("invalid request");
    }

    var referrer = Request.UrlReferrer.ToString();
    if (referrer.Contains("?"))
    {
        referrer = referrer.Split('?')[0];
    }

    var realId = Path.GetFileName(referrer);
    return this.Image(realId, id);
}

Вы заметите, что я полагаюсь на URL-реферер, чтобы получить фактический идентификатор статьи. Если пользователь пытается щелкнуть правой кнопкой мыши по изображению (при просмотре без косой черты) и выбирает «открыть изображение в новой вкладке», то у меня нет возможности узнать, что такое идентификатор статьи, поэтому я просто возвращаю «недопустимый запрос» Строка для пользователя. Это нормально, потому что я на самом деле не пытаюсь поддерживать этих пользователей в такой ситуации: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...