ASP.NET MVC dans un répertoire virtuel
-
06-07-2019 - |
Question
J'ai les éléments suivants dans mon fichier Global.asax.cs
routes.MapRoute(
"Arrival",
"{partnerID}",
new { controller = "Search", action = "Index", partnerID="1000" }
);
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = "" }
);
Mon SearchController ressemble à ceci
public class SearchController : Controller
{
// Display search results
public ActionResult Index(int partnerID)
{
ViewData["partnerID"] = partnerID;
return View();
}
}
et Index.aspx affichent simplement ViewData ["quotID" "] pour le moment.
J'ai un répertoire virtuel configuré dans IIS sous Windows XP appelé Test.
Si je pointe mon navigateur sur http: // localhost / Test / , le nombre 1000 s'affiche comme prévu. Toutefois, si j'essaie http: // localhost / Test / 1000 , une erreur de page introuvable s'affiche. Des idées?
Existe-t-il des considérations particulières pour l'exécution de MVC dans un répertoire virtuel?
La solution
IIS 5.1 interprète votre URL de manière à rechercher un dossier nommé 1000 dans le dossier nommé Test. Pourquoi est-ce vrai?
Cela se produit car IIS 6 uniquement invoque ASP.NET quand il voit un "Extension de nom de fichier" dans l'URL mappé sur aspnet_isapi.dll (qui est un Filtre ISAPI C / C ++ responsable de invoquer ASP.NET). Puisque le routage est un .NET IHttpModule appelé UrlRoutingModule, il ne reçoit pas invoqué sauf si ASP.NET lui-même obtient invoqué, ce qui n'arrive que lorsque aspnet_isapi.dll est appelé, qui n’arrive que quand il y a un .aspx dans l'URL. Donc, non .aspx, non UrlRoutingModule, d'où le 404.
La solution la plus simple est:
Si cela ne vous dérange pas d’avoir .aspx dans votre URL, il suffit de passer par votre routage config, en ajoutant .aspx avant un slash avant dans chaque motif. Pour exemple, utiliser {contrôleur} .aspx / {action} / {id} ou myapp.aspx / {contrôleur} / {action} / {id}. Ne mettez pas .aspx dans le noms de paramètres entre parenthèses, ou dans les valeurs par défaut, car il n’est pas fait vraiment partie du nom du contrôleur - c’est juste dans l’URL pour satisfaire IIS.
Source: http://blog.codeville.net/2008/07/04/options-for-de-deploying-aspnet-mvc-to-iis-6/
Autres conseils
Si vous le faites sous Windows XP, vous utilisez IIS 5.1. Vous devez obtenir ASP.Net pour traiter votre demande. Vous devez soit ajouter une extension à vos routes ({contrôleur} .mvc / {action} / {id}) et mapper cette extension sur ASP.Net ou mapper toutes les demandes sur ASP.Net. Le http: // localhost / Test fonctionne car il va à Default.aspx, qui est traité spécialement dans les projets MVC.
De plus, vous devez spécifier http: // localhost / Test / Search / Index / 1000 . Le contrôleur et les actions ne sont pas facultatifs si vous souhaitez spécifier un ID.
Plusieurs facteurs doivent être pris en compte lors de l’utilisation de répertoires virtuels dans votre application.
La première est que la plupart des navigateurs n'envoient pas de cookies provenant d'un répertoire virtuel à un autre, même si les applications résident sur le même serveur.
Essayez de définir le chemin virtuel: cliquez avec le bouton droit sur le projet MVC, les propriétés, l’onglet Web, puis entrez l’emplacement approprié.