Виртуальные пути к реальным физическим файлам с использованием маршрутизации в Asp.Net и IIS - PullRequest
0 голосов
/ 18 октября 2011

Я использую Asp.Net 4 C # с маршрутизацией.

Я использую маршрутизацию для перенаправления URL-адресов на реальные физические файлы.Мой код очень похож на этот .

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

Пример выходного маршрута:

<img alt="" src="/cdn/img/cms/e71e75ef-4906-4d04-8da5-bd459c7b9205/titolo-image.jpg"/>

Физический путь:

/cdn/img/cms/images/large/e71e75ef-4906-4d04-8da5-bd459c7b9205.jpg

На CASSINI все отлично работает при тестировании в локальной среде с Visual Studio 2010, но каккак только веб-сайт запускается в рабочей среде, использующей IIS 7.5, изображение src результат не найден.

Я полагаю, IIS не обрабатывает запрос статического файла .jpg так же, как.Net Page.

Я хотел бы знать, какие у меня есть варианты решения этой ситуации.

Вот код, который я использую для расширения маршрутизации изображений ..

с использованием Системы;using System.Collections.Generic;используя System.IO;использование System.Linq;использование System.Web;используя System.Web.Routing;

namespace WebProject.Cms.BusinessLogics.SEO.Routing
{
    /// <summary>
    /// Handler Custom Class for Asp.Net Routing. Routing URL's (Virtual paths) to actual physical files.
    /// <remarks>Resource at: http://www.phpvs.net/2009/08/06/aspnet-mvc-how-to-route-to-images-or-other-file-types/</remarks>
    /// </summary>
    public class ImageRouteHandler : IRouteHandler
    {
        public IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            string filename = requestContext.RouteData.Values["RowGuid"] as string;
            string size = requestContext.RouteData.Values["Size"] as string;
            string imageType = requestContext.RouteData.Values["ImageType"] as string;

            bool hasFileName = !string.IsNullOrEmpty(filename);
            bool hasSize =
                size == "large" ||
                size == "medium" ||
                size == "small";
            bool hasImageType =
                imageType == "jpg" ||
                imageType == "bmp" ||
                imageType == "gif" ||
                imageType == "png";

            if (!hasFileName || !hasSize || !hasImageType)
            {
                requestContext.HttpContext.Response.Clear();
                requestContext.HttpContext.Response.StatusCode = 404;
                requestContext.HttpContext.Response.End();
            }
            else
            {
                requestContext.HttpContext.Response.Clear();
                requestContext.HttpContext.Response.ContentType = GetContentType(requestContext.HttpContext.Request.Url.ToString());

                // Find physical path to image.
                string filepath = requestContext.HttpContext.Server.MapPath("~/Cdn/Cms/Images/" + size + "/" + filename + "." + imageType);

                requestContext.HttpContext.Response.WriteFile(filepath);
                requestContext.HttpContext.Response.End();
            }
            return null;
        }

        private static string GetContentType(String path)
        {
            switch (Path.GetExtension(path))
            {
                case ".bmp": return "Image/bmp";
                case ".gif": return "Image/gif";
                case ".jpg": return "Image/jpeg";
                case ".png": return "Image/png";
                default: break;
            }
            return "";
        }
    }
}

Ответы [ 2 ]

1 голос
/ 18 октября 2011

Следуя совету PirateKitten, я смог решить свою проблему, вот рабочий код в моем web.config:

   <system.webServer>
...

        <handlers>
            <add name="Cms-ImageRouteHandler" path="*.jpg" verb="*" type="WebProject.Cms.BusinessLogics.SEO.Routing.ImageRouteHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode" />
        </handlers>
...
1 голос
/ 18 октября 2011

Вы подозреваете, что правильно, вам нужно убедиться, что вы определили в своем файле web.config, что IIS должен перенаправлять запросы JPG к вашему новому пользовательскому обработчику.

Эта статья выглядит как хорошее руководство по интегрированному конвейеру в IIS7 и тому, как вы можете настроить его под свои нужды. Это будет просто случай регистрации вашего обработчика в web.config и установки его так, чтобы все пути * .jpg шли к вашему обработчику.

...