2009-03-31 3 views
4

Je génère un sitemap XML/Google à la volée en utilisant un Handler Http, de sorte que je n'ai pas besoin de maintenir un fichier XML manuellement.Spécification du chemin exact de mon ASP.NET Http Handler

Je cartographié mon Http Handler à "sitemap.xml" dans mon web.config comme ceci:

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

Il fonctionne très bien. Maintenant, www.mywebsite.com/sitemap.xml met mon Http Handler en action et fait exactement ce que je veux. Cependant, cette URL fera la même chose: www.mywebsite.com/some/folder/sitemap.xml et je ne veux pas vraiment que ce soit parce que je veux juste mapper mon gestionnaire à la racine de mon application.

J'ai essayé de changer le "chemin" de mon gestionnaire dans mon web.config en "/ sitemap.xml" et "~/sitemap.xml" mais ne fonctionne pas.

Ai-je oublié quelque chose ici?

Répondre

0

2 solutions à ce:

Soln # 1: Vous pouvez vérifier le chemin de la demande en utilisant la propriété Request.Url, si la demande est du chemin racine, vous pouvez générer le XML, sinon ne pas faire n'importe quoi.

Soln # 2: Placez un fichier web.config avec le paramètre suivant dans chaque dossier dans lequel vous ne souhaitez pas gérer la requête pour le fichier sitemap.xml.

+0

La solution 1 signifie toujours que le code du gestionnaire est exécuté. Je ne veux pas ça. Je ne veux l'exécuter que lorsqu'une URL spécifique (la racine) est demandée. Certes, c'est mon repli. La solution 2 n'est pas vraiment une option: mettre un web.config dans chaque répertoire! Que faire si j'ai des centaines de répertoires? –

5

Essayez d'ajouter ce qui suit à votre web.config

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

Il utilise une fonctionnalité peu connue de ASP.NET 2.0 appelé 'Url Mapping'

+0

C'est plus comme ce que je suis après, mais maintenant il faut un physique.fichier ashx et pour le moment je n'ai pas cela - juste une classe implémentant IHttpHandler, pas de fichier physique dans mon projet web. Je vais utiliser cette méthode SI il n'y a pas de meilleures suggestions ... –

+2

Vous pouvez simplement créer un fichier ashx dans votre application web pointant vers votre gestionnaire dans un autre assembly comme ceci: <% @ WebHandler Language = "C#" Class = "MyHandlersNamespace .MyHandler, MyHandler "%> Ici, je me réfère à un gestionnaire dans un autre ensemble appelé 'MyHandlers' –

1

suite de Kirtan suggéré solution # 1 vous pouvez faire une solution de contournement comme suit:

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 
} 

Il se peut que vous deviez jouer un peu avec ce comportement, mais vous ne savez pas si l'appel du gestionnaire par défaut ne fera qu'appeler de nouveau votre gestionnaire. Probablement la peine de tester en mode débogage de VS. Si elle ne vient invoquer de nouveau, alors vous devrez essayer d'invoquer un certain fichier statique gestionnaire à la place ou vous pouvez simplement émettre un HTTP 404 vous par exemple

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

Consultez la documentation MSDN sur HttpContext.RemapHandler pour plus d'informations - http://msdn.microsoft.com/en-us/library/system.web.httpcontext.remaphandler.aspx

+0

A eu un coup à ceci et a fini par émettre le 404 moi-même comme suggéré ci-dessus. Le code du gestionnaire est toujours exécuté mais uniquement si une page qui n'existe pas est demandée. – tentonipete

0

Vous pouvez, alternativement, lancer une vérification dans global.asax, vérifier la requête et enfin ré-assigner un nouveau gestionnaire via context.RemapHandler.
La seule chose est que vous auriez à implémenter une usine d'ailleurs.

Je vous suggère d'hériter de l'application HttpApplication, et d'y implémenter l'usine, mais c'est votre appel.

Questions connexes