ASP.NET MVC in una directory virtuale
-
06-07-2019 - |
Domanda
Ho il seguente nel mio 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 = "" }
);
Il mio SearchController si presenta così
public class SearchController : Controller
{
// Display search results
public ActionResult Index(int partnerID)
{
ViewData["partnerID"] = partnerID;
return View();
}
}
e Index.aspx mostrano semplicemente ViewData [" partnerID "] al momento.
Ho una directory virtuale impostata in IIS su Windows XP chiamata Test.
Se indico il mio browser su http: // localhost / Test / , visualizzo 1000 come previsto. Tuttavia, se provo http: // localhost / Test / 1000 visualizzo un errore di pagina non trovata. Qualche idea?
Vi sono considerazioni speciali per l'esecuzione di MVC in una directory virtuale?
Soluzione
IIS 5.1 interpreta l'URL in modo tale che stia cercando una cartella denominata 1000 nella cartella denominata Test. Perché è così?
Ciò accade perché solo IIS 6 invoca ASP.NET quando vede un & # 8220; estensione nome file & # 8221; nell'URL che & # 8217; s mappato su aspnet_isapi.dll (che è un Responsabile del filtro ISAPI C / C ++ invocando ASP.NET). Poiché il routing è a È stato chiamato .NET IHttpModule UrlRoutingModule, non lo ottiene invocato a meno che non si ottenga ASP.NET stesso invocato, che succede solo quando aspnet_isapi.dll viene richiamato, che succede solo quando c'è un .aspx in l'URL. Quindi, no .aspx, no UrlRoutingModule, da qui il 404.
La soluzione più semplice è:
Se non ti dispiace avere .aspx nel tuo URL, basta passare attraverso il routing config, aggiungendo .aspx prima di a barra in avanti in ogni modello. Per esempio, usa {controller} .aspx / {action} / {id} o myapp.aspx / {Controller} / {action} / {id}. Non inserire .aspx all'interno di nomi dei parametri tra parentesi graffe o in il & # 8216; predefinito & # 8217; valori, perché non è & # 8217; t fa davvero parte del nome del controller - è solo nell'URL per soddisfare IIS.
Fonte: http://blog.codeville.net/2008/07/04/options-for-deploying-aspnet-mvc-to-iis-6/
Altri suggerimenti
Se lo stai facendo su Windows XP, stai usando IIS 5.1. È necessario ottenere ASP.Net per gestire la richiesta. Devi aggiungere un'estensione ai tuoi percorsi ({controller} .mvc / {action} / {id}) e mappare tale estensione su ASP.Net o mappare tutte le richieste su ASP.Net. Il http: // localhost / Test funziona perché va su Default.aspx che viene gestito appositamente nei progetti MVC.
Inoltre, è necessario specificare http: // localhost / Test / Search / Index / 1000 . Il controller e le azioni non sono facoltativi se si desidera specificare un ID.
Vi sono diverse considerazioni sull'uso delle directory virtuali nell'applicazione.
Uno è particolare: la maggior parte dei browser non invierà cookie provenienti da una directory virtuale a un'altra, anche se le app risiedono sullo stesso server.
Prova a impostare il percorso virtuale: fai clic con il pulsante destro del mouse sul progetto mvc, proprietà, scheda Web, inserisci la posizione appropriata.