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 в виртуальном каталоге?


person Evil Andy    schedule 08.10.2008    source источник


Ответы (4)


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, что происходит только тогда, когда в URL-адресе есть .aspx. Итак, нет .aspx, нет UrlRoutingModule, следовательно, 404.

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

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

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

person Amith George    schedule 26.10.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. Элементы контроллера и действия не являются обязательными, если вы хотите указать идентификатор.

person Sean Carpenter    schedule 11.10.2008
comment
Спасибо за ответ. Это действительно проблема с IIS 5.x, и я фактически решил ее, используя Visual Studio Development Server. Затем он отлично работает как для localhost, так и для localhost / 1000. Если вы хотите отредактировать последний абзац, я отмечу ваш ответ как принятый. - person Evil Andy; 12.10.2008

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

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

person NotMe    schedule 08.10.2008
comment
И причина голосования против? Потому что вышесказанное действительно является особым вниманием к описанной ситуации. - person NotMe; 08.10.2008
comment
Я не голосовал против, но ваше особое внимание является общим для всех веб-приложений, и OP конкретно спрашивал об ASP.NET MVC. Другими словами, ваш ответ, хотя и правильный с технической точки зрения, не отвечает на вопрос. - person Joel Mueller; 12.10.2008

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

person Hrvoje Hudo    schedule 08.10.2008