2010-09-09 7 views
0

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

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

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

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

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

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; 
     } 

ответ

1

Я не уверен, если это полностью отвечает на ваш вопрос ... Я также построил ASP.NET CMS, которая была 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> 
+0

Ваше право, это не был полный ответ, но имеет своего рода подтверждение того, что я пытаюсь. –

 Смежные вопросы

  • Нет связанных вопросов^_^