2009-07-07 4 views
4

J'ai un site Web asp.net hérité Je migre vers asp.net mvc.asp.net mvc mappage d'itinéraires anciens

Je souhaite rediriger de manière permanente les URL existantes vers les contrôleurs mvc asp.net. J'ai des contrôleurs avec des vues pour le nouvel emplacement pour ces liens, et je voudrais faire une redirection 301 sur les pages existantes vers les nouvelles vues.

J'ai deux différents types de urls:

  1. http://foosite.com/privacy.aspx
  2. http://foosite/bar/content-name

type 2 urls sont le résultat d'un module url rewriter existant d'avant la manipulation de la route asp.net mvc.

je code de redirection existant:

Response.Clear(); 
Response.Status = "301 Moved Permanently"; 
Response.AddHeader("Location", url); 
Response.End(); 

Où dois-je faire la redirection?

Je vois deux options:

Application_BeginRequest - utiliser regex pour analyser l'url

Ce que j'aime ce:

  • Je vérifie déjà urls majuscules pour rediriger vers urls en minuscules ici
  • J'ai la chance de travailler directement avec la réponse sans avoir à retourner un n ActionResult

Ce que je ne l'aime pas à ce sujet:

  • type d'URL # 2 du haut doit être mis en correspondance dans les nouveaux contrôleurs/vues, ce qui signifie que je dois faire une base de données travailler pour obtenir le chemin de l'URL

Actions contrôleur - utiliser les routes & contrôleurs pour faire la redirection

Ce que j'aime ce:

  • je peux proprement faire le travail de base de données dont j'ai besoin

Ce que je ne l'aime pas à ce sujet:

  • Le le contrôleur doit retourner une vue, et je suis en train de manipuler directement le flux de réponse pour créer le 301.

Toutes les suggestions seraient grandes, merci.

Répondre

3

Parmi ces deux choix, je voudrais aller avec les actions du contrôleur. Les contrôleurs ne sont pas requis pour retourner une vue - Je crois que vous pouvez même faire une méthode de contrôleur de retour void avec ASP.NET MVC. La raison pour laquelle j'aime cette option est à cause de l'interaction de la base de données - je pense que la création d'une base de données dans BeginRequest va affecter les performances globales.

Si ce n'est pas un problème, je pense que le mettre avec le reste de l'information de routage est le plus logique (c'est-à-dire avec BeginRequest).

+0

Je me suis aussi penché vers les contrôleurs. Ne pas appeler la couche de service dans global.asax est ce qui m'a vendu. La partie étrange est de jouer directement avec la réponse et de retourner une vue nulle. – blu

+0

Avez-vous cherché à retourner une RedirectToAction ou quelque chose comme ça? –

+0

Je ne veux pas vraiment rediriger vers une action, n'est-ce pas? Je veux envoyer la réponse http pour 301 et laisser le navigateur gérer la redirection. – blu