2009-03-31 3 views
4

Ich erzeuge eine XML/Google-Sitemap mit Hilfe eines Http-Handlers, so dass ich keine XML-Datei manuell verwalten muss.Genaue Pfadangabe für meinen ASP.NET Http Handler

Ich habe meine Http-Handler "sitemap.xml" in meinem web.config wie folgt abgebildet:

<httpHandlers> 
    <add verb="*" path="sitemap.xml" type="My.Name.Space, MyAssembly" /> 
</httpHandlers> 

Es funktioniert gut. Jetzt setzt www.mywebsite.com/sitemap.xml meinen Http Handler in Aktion und macht genau das, was ich will. Allerdings wird diese URL das gleiche tun: www.mywebsite.com/some/folder/sitemap.xml und ich möchte das nicht wirklich, d. H. Ich möchte meinen Handler nur dem Stamm meiner Anwendung zuordnen.

Ich habe versucht, den "Pfad" meines Handlers in meiner web.config zu "/sitemap.xml" und "~/sitemap.xml" zu ändern, aber keiner funktioniert.

Fehle ich hier etwas?

Antwort

0

2 Lösungen dazu:

Soln # 1: Sie können den Anforderungspfad überprüfen Sie die Request.Url Eigenschaft verwenden, wenn die Anforderung von dem Root-Pfad ist, können Sie die XML generieren, sonst nicht mach alles.

Soln # 2: Legen Sie eine web.config-Datei mit der folgenden Einstellung in jeden Ordner, in dem Sie die Anforderung für die sitemap.xml-Datei nicht behandeln möchten.

+0

Lösung 1 bedeutet immer noch, dass der Code des Handlers ausgeführt wird. Ich will das nicht. Ich möchte es nur ausführen, wenn eine bestimmte URL (der Stamm) angefordert wird. Zugegeben, das ist mein Fallback. Lösung 2 ist nicht wirklich eine Option: eine web.config in jedes Verzeichnis einfügen! Was passiert, wenn ich Hunderte von Verzeichnissen habe? –

5

Versuchen Hinzufügen Sie folgendes zu Ihrem web.config

<urlMappings enabled="true"> 
    <add url="~/SiteMap.xml" mappedUrl="~/MyHandler.ashx"/> 
</urlMappings> 

Dieses ein wenig bekanntes Feature von ASP.NET 2.0 verwendet genannt 'Url Mapping'

+0

Das ist mehr wie ich bin, aber jetzt braucht es eine physische.Ashx-Datei und im Moment habe ich das nicht - nur eine Klasse implementieren IHttpHandler, keine physische Datei in meinem Web-Projekt. Ich werde diese Methode verwenden, wenn es keine besseren Vorschläge gibt ... –

+2

Sie können einfach eine Ashx-Datei in Ihrer Webanwendung erstellen, die auf Ihren Handler in einer anderen Assembly verweist: <% @ WebHandler Language = "C#" Class = "MyHandlersNamespace .MyHandler, MyHandler "%> Hier beziehe ich mich auf einen Handler in einer anderen Assembly mit dem Namen 'MyHandlers' –

1

von Kirtan Im Anschluss an vorgeschlagene Lösung # 1 können Sie einen Workaround wie folgt tun:

public void ProcessRequest(HttpContext context) { 
    //Ensure that the sitemap.xml request is to the root of the application 
    if (!context.Request.PhysicalPath.Equals(Server.MapPath("~/sitemap.xml"))) { 
    //Invoke the Default Handler for this Request 
    context.RemapHandler(null); 
    } 

    //Generate the Sitemap 
} 

Sie müssen möglicherweise etwas damit spielen, nicht sicher, ob das Aufrufen des Standardhandlers dazu führt, dass IIS Ihren Handler erneut aufruft. Wahrscheinlich lohnt es sich, im Debug-Modus von VS zu testen. Wenn es funktioniert einfach wieder aufrufen dann Sie versuchen müssen einige statische Datei-Handler anstelle aufrufen oder Sie könnten ausgeben nur eine HTTP 404 sich zB

//Issue a HTTP 404 
context.Response.Clear(); 
context.Response.StatusCode = (int)System.Net.HttpStatusCode.NotFound; 
return; 

finden Sie in der MSDN-Dokumentation auf HttpContext.RemapHandler für weitere Informationen - http://msdn.microsoft.com/en-us/library/system.web.httpcontext.remaphandler.aspx

+0

Hatte einen gehen an diesem und endete die Ausgabe 404 selbst, wie oben vorgeschlagen. Der Handler-Code wird weiterhin ausgeführt, jedoch nur, wenn eine Seite angefordert wird, die nicht existiert. – tentonipete

0

Sie können alternativ eine Prüfung in der Datei global.asax ausführen, die Anforderung überprüfen und schließlich einen neuen Handler über die context.RemapHandler-Methode neu zuweisen.
Das einzige ist, dass Sie eine Fabrik für diese Angelegenheit implementieren müssten.

Ich würde vorschlagen, Sie erben die HttpApplication, und implementieren Sie dort die Fabrik, aber das ist Ihr Anruf.

Verwandte Themen