использование HttpHandlerFactory для рендеринга CMS и физических страниц

Я нахожусь в процессе написания системы CMS, и после прочтения и работы с несколькими примерами я остановился на HttpHandlerFactory, чтобы выполнить то, что мне нужно.

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

после создания класса обработчика я добавил следующее в веб-конфигурацию моего сайта

<add verb="*" path="*.aspx" type="Web.Helpers.HttpCMSHandlerFactory, Web.Helpers"/>

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

    public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
    {
        string pageName = Path.GetFileNameWithoutExtension(context.Request.PhysicalPath);
        context.Items.Add("PageName", pageName);
        //DirectoryInfo di = new DirectoryInfo(context.Request.MapPath(context.Request.ApplicationPath));
        FileInfo fi = new FileInfo(context.Request.MapPath(context.Request.CurrentExecutionFilePath));
        //var file = fi.Where(x => string.Equals(x.Name, string.Concat(pageName, ".aspx"), StringComparison.InvariantCultureIgnoreCase)).SingleOrDefault();
        if (fi.Exists == false)
        {
           // think I had this the wrong way around, the url should come first with the renderer page second
            return PageParser.GetCompiledPageInstance(url, context.Server.MapPath("~/CMSPage.aspx"), context);
        }
        else
        {
            return PageParser.GetCompiledPageInstance(context.Request.CurrentExecutionFilePath, fi.FullName, context);
        }
    }

Вопрос, который у меня есть, заключается в том, должен ли я использовать что-то кроме PageParser.GetCompiledPageInstance, когда есть физическая страница?

Обновление: после вышеизложенного я продолжил разработку HttpHandler для изображений, который снова работает по тому же принципу, что если изображение существует, используйте его в другом случае из базы данных. Были небольшие проблемы с файлами png, но описанный ниже процесс работает для показанных форматов файлов.

        byte[] image = null;
        if (File.Exists(context.Request.PhysicalPath))
        {
            FileStream fs = new FileStream(context.Request.PhysicalPath, FileMode.Open, FileAccess.Read);
            BinaryReader br = new BinaryReader(fs);

            image = br.ReadBytes((int)fs.Length);
        }
        else
        {
            IKernel kernel = new StandardKernel(new ServiceModule());
            var cmsImageService = kernel.Get<IContentManagementService>();
            var framework = FrameworkSetup.GetSetFrameworkSettings();
            image = cmsImageService.GetImage(Path.GetFileName(context.Request.PhysicalPath), framework.EventId);
        }

        var contextType = "image/jpg";
        var format = ImageFormat.Jpeg;

        switch (Path.GetExtension(context.Request.PhysicalPath).ToLower())
        {
            case ".gif":
                contextType = "image/gif";
                format = ImageFormat.Gif;
                goto default;
            case ".jpeg":
            case ".jpg":
                contextType = "image/jpeg";
                format = ImageFormat.Jpeg;
                goto default;
            case ".png":
                contextType = "image/png";
                format = ImageFormat.Png;
                goto default;
            default:
                context.Cache.Insert(context.Request.PhysicalPath, image);
                context.Response.ContentType = contextType;
                context.Response.BinaryWrite(image);
                context.Response.Flush();
                break;
        }

person Luke Duddridge    schedule 09.09.2010    source источник


Ответы (1)


Я не уверен, что это полностью отвечает на ваш вопрос... Я также создал CMS ASP.NET, управляемую HttpHandler, которая также позволяет использовать физические страницы .aspx. Поскольку у меня было лишь небольшое количество физических .aspx-файлов и местоположений, проще всего было управлять выполнением через web.config.

Во-первых, я настраиваю веб-сайт (в общих чертах) для использования моего обработчика, за исключением страницы входа (в качестве примера):

<add verb="*" path="login.aspx" type="System.Web.UI.PageHandlerFactory"/>
<add verb="*" path="Register.aspx" type="System.Web.UI.PageHandlerFactory"/>
<add verb="*" path="*.aspx" type="Morphfolia.PublishingSystem.HttpHandlers.DefaultHandler, Morphfolia.PublishingSystem"/>

Другая вещь, которую вы можете сделать, это изолировать с помощью location, поэтому для этой части сайта я предпочитаю использовать готовый обработчик ASP.NET, который обычно обрабатывает «классические» запросы ASP.NET:

<location path="Morphfolia/_publishing">
  <system.web>
    <httpHandlers>
      <add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory"/>
    </httpHandlers>
  </system.web>
</location>
person Adrian K    schedule 04.10.2010
comment
Вы правы, это был не полный ответ, но он как бы подтвердил то, что я пытаюсь сделать. - person Luke Duddridge; 05.10.2010