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