2008-10-08 18 views
10

Mam następujących w moim Global.asax.csASP.NET MVC w katalogu wirtualnego

routes.MapRoute(
    "Arrival", 
    "{partnerID}", 
    new { controller = "Search", action = "Index", partnerID="1000" } 
); 

routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = "" } 
); 

Moja SearchController wygląda to

public class SearchController : Controller 
{ 
    // Display search results 
    public ActionResult Index(int partnerID) 
    { 
     ViewData["partnerID"] = partnerID; 
     return View(); 
    } 
} 

i Index.aspx prostu pokazuje ViewData [” partnerID "] w tej chwili.

Mam katalog wirtualny skonfigurowany w IIS w systemie Windows XP o nazwie Test.

Jeśli wskażę moją przeglądarkę pod http://localhost/Test/, otrzymam 1000 wyświetlanego zgodnie z oczekiwaniami. Jednakże, jeśli spróbuję http://localhost/Test/1000, otrzymam błąd nie znalezienia strony. Jakieś pomysły?

Czy są jakieś specjalne uwagi dotyczące uruchamiania MVC w katalogu wirtualnym?

Odpowiedz

4

IIS 5.1 interpretuje twój adres URL tak, że szuka folderu o nazwie 1000 w folderze o nazwie Test. Dlaczego to jest takie?

Dzieje się tak dlatego, IIS 6 tylko wywołuje ASP.NET, gdy widzi „rozszerzenie pliku” w URL, który jest odwzorowane na aspnet_isapi.dll (co jest C/C++ filtr ISAPI odpowiedzialne za wywoływanie ASP.NET). Ponieważ routing jest NET IHttpModule nazywa UrlRoutingModule, nie powoływać się chyba ASP.NET sama dostaje wywoływany, który zdarza się tylko gdy zostanie wywołana aspnet_isapi.dll, który tylko się dzieje, gdy istnieje .aspx w adres URL. Tak więc, nie aspx, nie UrlRoutingModule, a więc najprostszym rozwiązaniem 404.

jest:

Jeśli nie przeszkadza konieczności .aspx w swoim URL, wystarczy przejść przez routing config, dodając .aspx przed ukośnik w każdym wzorze. Dla przykładu: , użyj {kontroler} .aspx/{action}/{id} lub myapp.aspx/{controller}/{action}/{id}. Nie umieszczaj .aspx w nazwach parametrów nawiasów klamrowych ani na wartości "domyślnych", ponieważ nie jest to naprawdę część nazwy kontrolera - jest po prostu w adresie URL, aby spełnić IIS.

Źródło: http://blog.codeville.net/2008/07/04/options-for-deploying-aspnet-mvc-to-iis-6/

1

Podczas korzystania z katalogów wirtualnych w aplikacji istnieje wiele czynników.

Jednym z nich jest to, że większość przeglądarek nie wysyła plików cookie, które pochodziły z jednego katalogu wirtualnego do innego, nawet jeśli aplikacje znajdują się na tym samym serwerze.

+0

A powodem jest głosowanie w dół? Ponieważ powyższe jest w rzeczywistości szczególnym uwzględnieniem opisanej sytuacji. – NotMe

+1

Nie oddałem Ci głosu w dół, ale twoja uwaga jest wspólna dla wszystkich aplikacji internetowych, a OP pytał konkretnie o ASP.NET MVC. Innymi słowy, twoja odpowiedź, choć technicznie poprawna, nie odpowiada na pytanie. –

1

Spróbuj ustawić ścieżkę wirtualną: kliknij prawym przyciskiem myszy na projekcie mvc, właściwości, zakładkę WWW, tam wprowadź odpowiednią lokalizację.

2

Jeśli robisz to w systemie Windows XP, to używasz IIS 5.1. Musisz pobrać ASP.Net, aby obsłużyć Twoją prośbę. Musisz dodać rozszerzenie do swoich tras ({controller} .mvc/{action}/{id}) i zmapować to rozszerzenie do ASP.Net lub zmapować wszystkie żądania do ASP.Net. The http://localhost/Test działa, ponieważ przechodzi do Default.aspx, który jest obsługiwany specjalnie w projektach MVC. Ponadto należy podać http://localhost/Test/Search/Index/1000. Kontroler i elementy akcji nie są opcjonalne, jeśli chcesz określić identyfikator.

+0

Dzięki za odpowiedź. To rzeczywiście jest problem z IIS 5.x i faktycznie obejrzałem go za pomocą Visual Studio Development Server. Działa wtedy dobrze zarówno dla http: // localhost, jak i http: // localhost/1000. Jeśli chcesz edytować ten ostatni akapit, zaznaczę twoją odpowiedź jako zaakceptowaną. –