Pregunta

Estoy en el medio de escribir un sistema CMS y después de leer y trabajar a través de algunos ejemplos, que se han asentado en la HttpHandlerFactory para llevar a cabo lo que necesito.

El punto clave es nuestros sitios son generalmente una combinación de procesos de copia y registro. Por lo tanto, actualmente necesito usar el valor por defecto para HttpHandler aspx para hacer que las páginas de registro físicas hasta que pueda trabajar de una manera de gestionar el contenido de ellas también.

después de crear la clase de controlador que añadió lo siguiente a la web de mi página web config

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

A medida que las asas ruta anterior físicas y CMS páginas controladas, con un pequeño mostrador en el código soy capaz de ver si la página existe físicamente y luego se puede mostrar la página deseada.

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

La pregunta que tengo es debo utilizar algo distinto de PageParser.GetCompiledPageInstance cuando hay una página física?

Actualización: ya que el anterior he pasado a desarrollar y HttpHandler para imágenes, que a su vez funciona en el mismo principio de si la imagen existe usarlo otra cosa servirá de base de datos. Tenía un poco de problema con los archivos PNG, pero por debajo de la estructura de los formatos de archivo que se muestran.

        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;
        }
¿Fue útil?

Solución

No estoy seguro de si esto responde completamente a su pregunta ... También he construido un CMS ASP.NET que se HttpHandler expulsados, y que también permite las páginas .aspx físicas. Ya que solo tenía un pequeño número de archivos .aspx físicas y ubicaciones de la forma más fácil de gestionar la ejecución fue a través de web.config.

En primer lugar, puedo configurar la página web (en términos generales) a usar mi manejador - a excepción de la página de inicio de sesión (como ejemplo):

<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"/>

La otra cosa que puede hacer es aislado por location, por lo que para esta parte del sitio que estoy optando por utilizar el controlador ASP.NET fuera de la caja que normalmente procesa las solicitudes de "clásicos" de ASP.NET:

<location path="Morphfolia/_publishing">
  <system.web>
    <httpHandlers>
      <add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory"/>
    </httpHandlers>
  </system.web>
</location>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top