ASP.NET MVC в виртуальном каталоге

У меня есть следующее в моем 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 = "" }
);

Мой SearchController выглядит как

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

и Index.aspx просто показывает ViewData [ "partnerID" ] на данный момент.

У меня есть виртуальный каталог, настроенный в IIS в Windows XP под названием Test.

Если я укажу свой браузер на http://localhost/Test/, тогда я получу 1000, как ожидалось. Однако, если я попробую http://localhost/Test/1000, я получаю сообщение об ошибке страницы. Любые идеи?

Есть ли какие-либо особые соображения для запуска MVC в виртуальном каталоге?

Ответ 1

IIS 5.1 интерпретирует ваш URL-адрес таким образом, что он ищет папку под именем 1000 под папкой Test. Почему это так?

Это происходит потому, что только IIS 6 вызывает ASP.NET, когда видит "расширение имени файла" в URL-адресе сопоставлен с aspnet_isapi.dll(который является Фильтр ISAPI C/С++, отвечающий за вызывая ASP.NET). Поскольку маршрутизация является .NET IHttpModule называется UrlRoutingModule, он не получает вызывается, если сам ASP.NET не получает вызывается, что происходит только тогда, когда Вызывается aspnet_isapi.dll, который происходит только тогда, когда theres.aspx в URL. Итак, нет .aspx, no UrlRoutingModule, следовательно, 404.

Самое простое решение:

Если вы не против иметь .aspx в своем URL-адреса, просто пройдите через вашу маршрутизацию config, добавив .aspx до вперед-слэш в каждом шаблоне. Для пример, использование {controller}.aspx/{action}/{id} или myapp.aspx/{контроллер}/{действие}/{ID}. Не помещайте .aspx внутри имена переменных в фигурных скобках или в "значения по умолчанию, потому что это не действительно часть имени контроллера - его только в URL-адресе, чтобы удовлетворить IIS.

Источник: http://blog.codeville.net/2008/07/04/options-for-deploying-aspnet-mvc-to-iis-6/

Ответ 2

Если вы делаете это в Windows XP, вы используете IIS 5.1. Вы должны получить ASP.Net для обработки вашего запроса. Вам нужно либо добавить расширение к вашим маршрутам ({controller}.mvc/{action}/{id}), и сопоставить это расширение с ASP.Net, либо отобразить все запросы в ASP.Net. http://localhost/Test работает, потому что он переходит в Default.aspx, который обрабатывается специально в проектах MVC.

Кроме того, вам нужно указать http://localhost/Test/Search/Index/1000. Контроллер и куски действий не являются необязательными, если вы хотите указать идентификатор.

Ответ 3

При использовании виртуальных каталогов в приложении существует ряд соображений.

В частности, большинство браузеров не будут отправлять файлы cookie, которые поступают из одного виртуального каталога в другой, даже если приложения находятся на одном сервере.

Ответ 4

Попробуйте установить виртуальный путь: щелкните правой кнопкой мыши по проекту mvc, свойствам, веб-вкладке, введите соответствующее местоположение.