2009-08-22 9 views
3

Ich schreibe eine einfache HttpHandler für URL-Umschreiben, aber ich bin auf einer Mauer.HttpHandler nicht umschreiben

Ich habe eine Httphandler-Klasse erstellt, die nur wirklich einfach, die Dinge zu testen:

public class HttpHandler : IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     context.RewritePath("default.aspx", false); 
     //Rewriter.Rewrite(context); 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return true; 
     } 
    } 
} 

ich dann in den web.config das folgende Verb haben:

<httpHandlers> 
    <add verb="*" path="*" type="Tizma.CMS.Runtime.HttpHandler"/> 
</httpHandlers> 

ich im Grunde alle eingehenden URLs will durch diesen Umschreiber zu gehen. Wenn ich das ausführe, wird ProcessRequest ausgelöst, aber der RewritePath wird nie zu default.aspx.

Bitte beachten Sie, dies ist nur ein Test und schließlich default.aspx wird eine Abfrage Zeichenfolge in der Form von? Pageid = 2 Ich wollte nur herausfinden, wie httphandlers zuerst arbeitete.

Was mache ich falsch?

Antwort

12

Andy - man kann nicht RewritePath() in einem Handler nennen - es ist viel zu spät, zu diesem Zeitpunkt. Zu dem Zeitpunkt, an dem Sie Ihren Handler ankreuzen, ist die Anfrage bereits zum Abschluss geroutet und RewritePath() tut nichts.

RewritePath muss sehr früh im Anforderungszyklus aufgerufen werden (wie BeginRequest oder irgendetwas bevor das CacheModul startet), so dass Sie höchstwahrscheinlich ein HttpModule benötigen und das entsprechende frühe Pipeline-Ereignis haken müssen.

+0

Ich sehe, das macht jetzt Sinn. Also muss der Handler im Grunde den Inhalt erzeugen und ihn herausleiten. OK, das sollte kein Problem sein. – Andy

+0

Danke für die Hilfe Rick, ich bin jetzt sortiert. – Andy

0

Was erwarten Sie zu sehen? RewritePath ändert den Pfad intern, ohne dem Benutzer eine andere URL anzuzeigen. Wenn default.aspx aufgerufen wird, funktioniert es.

+0

Das ist richtig. Ich möchte nicht, dass die Benutzer-URL geändert wird, aber intern möchte ich meine default.aspx-Seite mit der Abfragezeichenfolge "pageno = 3 " öffnen. Default.aspx gibt dann die richtigen Seitendetails zurück. Mein Problem ist, dass default.aspx nie zu seinem Page_Load-Ereignis zu kommen scheint. – Andy

2

Mit einem HttpHandler überschreiben Sie den gesamten Web Forms-Mechanismus für die Verarbeitung von Anfragen (System.Web.UI.Page implementiert IHttpHandler). In Ihrer Computerebene web.config Datei, werden Sie

<add path="*.aspx" verb="*" type="System.Web.UI.PageHandlerFactory" validate="true"/> 

Umschreiben die URL zu default.aspx nicht viel erreichen, weil Ihre web.config, dass Standard-Handler-Zuordnung überschreibt und sagen, dass Ihr Httphandler soll aufgerufen werden, um alle URLs zu verarbeiten, einschließlich default.aspx.

Sie möchten ein HttpModule, das wahrscheinlich das BeginRequest-Ereignis behandelt. Ein HttpModule kann einzelne Ereignisse über den Anforderungslebenszyklus behandeln, ohne das gesamte Standardverhalten zu überschreiben.

+0

Danke Steve. Genau das mache ich jetzt. Ich habe das BeginRequest-Ereignis mit meinem eigenen benutzerdefinierten HttpModule verknüpft. Funktioniert gut :) – Andy

Verwandte Themen