Question

Je suis en train d'écrire un système CMS et après avoir lu et de travailler à travers quelques exemples, j'ai réglé sur HttpHandlerFactory pour effectuer ce que je dois.

le point clé est nos sites sont généralement un mélange de processus de copie et d'enregistrement. Donc, j'ai besoin actuellement d'utiliser la valeur par défaut HttpHandler pour ASPX pour rendre les pages d'enregistrement physique jusqu'à ce que je peux travailler une façon de les gérer le contenu aussi.

après avoir créé la classe de gestionnaire j'ajouté config toile de ce qui suit à mon site

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

Comme les pages physiques et conduits cm poignées de chemin ci-dessus, avec un petit chèque dans le code, je suis en mesure de voir si la page existe physiquement et peut alors rendre la page souhaitée.

    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 question que j'est devrais-je utiliser autre chose que PageParser.GetCompiledPageInstance quand il y a une page physique?

Mise à jour: depuis ce qui précède, je suis allé à développer et HttpHandler pour les images, qui fonctionne à nouveau sur le même principe de si l'image existe utiliser la base de données servira d'autre. Il y avait un peu de problème avec les fichiers png, mais le processus ci-dessous fonctionne pour les formats de fichiers indiqués.

        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;
        }
Était-ce utile?

La solution

Je ne sais pas si cela répond complètement à votre question ... J'ai aussi construit un CMS ASP.NET qui a été HttpHandler Driven, et qui permet également des pages .aspx physiques. Comme je l'ai seulement eu un petit nombre de fichiers .aspx physiques et les lieux la meilleure façon de gérer l'exécution était par web.config.

Tout d'abord, je configure le site Web (en termes généraux) d'utiliser mon gestionnaire - sauf pour la page de connexion (par exemple):

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

L'autre chose que vous pouvez faire est isolé par location, donc pour cette partie du site que je optant pour utiliser le hors-the-box gestionnaire ASP.NET qui traite normalement demandes ASP.NET « classiques »:

<location path="Morphfolia/_publishing">
  <system.web>
    <httpHandlers>
      <add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory"/>
    </httpHandlers>
  </system.web>
</location>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top