ASP.NET MVC в виртуальном каталоге - PullRequest
10 голосов
/ 08 октября 2008

У меня есть следующее в моем 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 в виртуальном каталоге?

Ответы [ 4 ]

4 голосов
/ 26 октября 2008

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

Это происходит потому, что только IIS 6 вызывает ASP.NET, когда он видит «Расширение файла» в URL, который сопоставлен с aspnet_isapi.dll (который является C / C ++ ISAPI фильтр отвечает за вызывая ASP.NET). Поскольку маршрутизация является .NET IHttpModule вызывается UrlRoutingModule, он не получает вызывается, если ASP.NET сам не получает вызывается, что происходит только тогда, когда aspnet_isapi.dll вызывается, который происходит только когда есть .aspx в URL. Итак, нет. ASPX, нет UrlRoutingModule, следовательно, 404.

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

Если вы не против иметь .aspx в вашем URL, просто пройдите свою маршрутизацию конфиг, добавив .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 голосов
/ 11 октября 2008

Если вы делаете это в 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. Контроллер и элементы действия не являются обязательными, если вы хотите указать идентификатор.

1 голос
/ 08 октября 2008

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

1 голос
/ 08 октября 2008

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

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

...