2009-03-23 3 views
3

Ich baue eine Website mit ASP.NET 3.5, und die meisten der Website-Struktur ist statisch genug, um eine Ordnerstruktur und ASPX-Seiten zu erstellen. Die Websiteadministratoren möchten jedoch über eine Webschnittstelle und mithilfe eines WYSIWYG-Editors neue Seiten zu verschiedenen Bereichen der Website hinzufügen. Ich verwende verschachtelte Masterseiten, um den verschiedenen Bereichen der Site ihre eigenen Menüs zu geben. Was ich tun möchte, ist eine generische Seite unter jedem Abschnitt der Website, die die entsprechende Masterseite verwendet und einen Platzhalter für Inhalte hat, die aus einer Datenbank geladen werden können. Ich möchte auch, dass diese "falschen" Seiten eine URL wie jede andere aspx-Seite haben, als ob sie entsprechende Dateien auf dem Server hätten. Anstatt also haben meinen url sein:Kann ich HttpHandler verwenden, um die Existenz von ASPX-Seiten zu fälschen?

http://mysite.com/subsection/gerenicconent.aspx?contentid=1234 

es wäre so etwas wie:

http://mysite.com/subsection/somethingmeaningful.aspx 

Das Problem ist, dass somethingmeaningful.aspx nicht vorhanden, da der Administrator es über die Web-Benutzeroberfläche erstellt und Der Inhalt wird in der Datenbank gespeichert. Was ich denke ist, dass ich einen HTTP-Handler implementieren werde, der Anfragen für aspx-Dateien behandelt. In diesem Handler überprüfe ich, ob die angeforderte URL eine tatsächliche Datei oder eine meiner "gefälschten Seiten" ist. Wenn es sich um eine Anfrage für eine gefälschte Seite handelt, route ich die Anfrage erneut an die generische Inhaltsseite für den entsprechenden Abschnitt, ändere die Abfragezeichenfolge, um die entsprechenden Daten aus der Datenbank anzufordern, und schreibe die URL so um, dass sie sie anschaut der Benutzer, als ob die gefälschte Seite wirklich existiert. Das Problem, das ich gerade habe, ist, dass ich nicht herausfinden kann, wie man die Anfrage an den Standard-Handler für ASPX-Seiten weiterleitet. Ich habe versucht, eine PageHandlerFactory zu instantiieren, aber der Konstruktor ist intern geschützt. Gibt es eine Möglichkeit für mich, meinem HttpHandler zu sagen, dass er den HttpHandler aufrufen soll, mit dem normalerweise eine Anfrage bearbeitet wird? Mein Handler Code sieht derzeit wie folgt aus:

using System.Web; 
using System.Web.UI; 

namespace HandlerTest 
{ 
    public class FakePageHandler : IHttpHandler 
    { 
     public bool IsReusable 
     { 
      get { return false; } 
     } 

     public void ProcessRequest(HttpContext context) 
     { 
      if(RequestIsForFakedPage(context)) 
      { 
       // reroute the request to the generic page and rewrite the URL 
       PageHandlerFactory factory = new PageHandlerFactory(); // this won't compile because the constructor is protected internal 
       factory.GetHandler(context, context.Request.RequestType, GetGenericContentPath(context), GetPhysicalApplicationPath(context)).ProcessRequest(context); 
      } 
      else 
      { 
       // route the request to the default handler for aspx pages 
       PageHandlerFactory factory = new PageHandlerFactory(); 
       factory.GetHandler(context, context.Request.RequestType, context.Request.Path, context.Request.PhysicalPath).ProcessRequest(context); 
      } 
     } 

     public string RequestForPageIsFaked(HttpContext context) 
     { 
      // TODO 
     } 

     public string GetGenericContentPath(HttpContext context) 
     { 
      // TODO 
     } 

     public string GetPhysicalApplicationPath(HttpContext context) 
     { 
      // TODO 
     } 
    } 
} 

ich noch einige Arbeit zu tun, um zu bestimmen, ob die Anforderung für eine reale Seite ist, und ich habe neu geschrieben keine URLs noch nicht, aber ist so etwas wie das möglich? Gibt es eine andere Möglichkeit, eine PageHandlerFactory als den Aufruf seines Konstruktors zu erstellen? Gibt es eine Möglichkeit, die Anfrage an den "normalen" HttpHandler für eine Aspx-Seite zu leiten? Ich würde im Grunde sagen "verarbeiten Sie diese ASPX-Anfrage, wie Sie normalerweise würden."

Antwort

1

Ich habe gerade ein ähnliches System, das wir gerade geschrieben haben, abgezogen.

Diese Methode behandelt physische Seiten und "falsche" Seiten. Sie werden feststellen können, wie das zu Ihrem gefälschten Seitenschema passt, da bin ich mir sicher.

public class AspxHttpHandler : IHttpHandlerFactory 
{ 
     #region ~ from IHttpHandlerFactory ~ 

     public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated) 
     { 
        string url=context.Request.Url.AbsolutePath; 
      string[] portions = url.Split(new char[] { '/', '\\' }); 
        // gives you the path, i presume this will help you identify the section and page 
        string serverSidePage=Path.Combine(context.Server.MapPath("~"),url); 
        if (File.Exists(serverSidePage)) 
        { 
          // page is real 
          string virtualPath = context.Request.Url.AbsolutePath; 
       string inputFile = context.Server.MapPath(virtualPath); 

       try 
       { 
            // if it's real, send in the details to the ASPX compiler 
        return PageParser.GetCompiledPageInstance(virtualPath, inputFile, context); 
       } 
       catch (Exception ex) 
       { 
         throw new ApplicationException("Failed to render physical page", ex); 
       } 
         } 
         else 
         { 
          // page is fake 
          // need to identify a page that exists which you can use to compile against 
          // here, it is CMSTaregtPage - it can use a Master 
          string inputFile = context.Server.MapPath("~/CMSTargetPage.aspx"); 
       string virtualPath = "~/CMSTargetPage.aspx"; 
          // you can also add things that the page can access vai the Context.Items collection 
          context.Items.Add("DataItem","123"); 
          return PageParser.GetCompiledPageInstance(virtualPath, inputFile, context); 
} 

public void ReleaseHandler(IHttpHandler handler) 
{ 

} 
2

Sie würden mit einem http-Modul für diese besser dran, wie in diesem Fall, dass Sie die RewritePath Methode, damit die Anforderung für gefälschte Seiten verwenden können, und für die tatsächlichen Seiten nichts tun, was wird sie erlauben, wie normal verarbeitet werden.

Es gibt eine gute Erklärung dieser here, die auch die Vorteile der Verwendung von IIS 7.0 umfasst, wenn das eine Option für Sie ist.

Verwandte Themen