Подтвердить что ты не робот

ASP.NET MVC на IIS6

Где я могу найти хорошие рекомендации по лучшим методам работы ASP.NET MVC на IIS6?

Я не видел реалистичных вариантов для веб-хостов, которые еще не предоставили IIS7-хостинг. В основном потому, что я не живу в США.

Поэтому мне было интересно узнать, как лучше всего создавать приложения в ASP.NET MVC и сделать его доступным для развертывания как на IIS6, так и на IIS7. Имейте в виду, что это для стандартных веб-хостов, поэтому нет доступа к ISAPI-фильтрам или специальным настройкам внутри IIS6.

Есть ли что-нибудь еще, о чем следует подумать при разработке ASP.NET MVC-приложений для ориентации на IIS6? Любые функции, которые не работают?

ОБНОВЛЕНИЕ: одна из самых больших проблем - дело с маршрутами. Шаблон {controller}/{action} будет работать на IIS7, но не IIS6, который нуждается в {controller}.mvc/{action}. Итак, как я могу сделать это прозрачным? Опять же, без ISAPI и нет настроек IIS.

4b9b3361

Ответ 1

Мне потребовалось немного времени, но я понял, как сделать расширения с IIS 6. Сначала вам нужно переработать базовую маршрутизацию, чтобы включить .aspx, чтобы они были перенаправлены через фильтр ASP.NET ISAPI.

routes.MapRoute(
    "Default",                                              // Route name
    "{controller}.aspx/{action}/{id}",                      // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);

Если вы перейдете к Home.aspx, например, ваш сайт должен работать нормально. Но Default.aspx и адрес страницы по умолчанию http://[website]/ перестают работать правильно. Итак, как это исправлено?

Ну, вам нужно определить второй маршрут. К сожалению, использование Default.aspx в качестве маршрута не работает должным образом:

routes.MapRoute(
    "Default2",                                             // Route name
    "Default.aspx",                                         // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);

Итак, как вы это делаете? Ну, вот где вам нужен исходный код маршрутизации:

routes.MapRoute(
    "Default2",                                             // Route name
    "{controller}/{action}/{id}",                           // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);

Когда вы это сделаете, Default.aspx и http://[website]/ начинают работать снова, я думаю, потому что они успешно отображаются на Домашний контроллер. Таким образом, полное решение:

public class MvcApplication : System.Web.HttpApplication
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}.aspx/{action}/{id}",                      // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

        routes.MapRoute(
            "Default2",                                              // Route name
            "{controller}/{action}/{id}",                            // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );
    }

    protected void Application_Start()
    {
        RegisterRoutes(RouteTable.Routes);
    }
}

И ваш сайт должен начать работать отлично под IIS 6. (По крайней мере, на моем ПК.)

И в качестве бонуса, если вы используете Html.ActionLink() на своих страницах, вам не нужно менять какую-либо другую строку кода на всем сайте. Этот метод обеспечивает правильную маркировку расширения .aspx для контроллера.

Ответ 2

Поскольку вы не можете изменять настройки IIS для сопоставления .mvc с ASP.Net, вы можете использовать другое расширение, которое уже сопоставлено с ASP.Net. Например, вы можете использовать {controller}.ashx/{action}, и он должен работать из коробки в IIS 6.

Ответ 3

Вам не нужно проживать с этим расширением, если вы можете установить на сервере фильтр ISAPI.

В основном вы маршрутизируете URL-адреса для {controller}.mvc разновидности, затем в ASP.NET вы переписываете этот URL-адрес для удаления .mvc - при этом вам не нужно определять какие-либо дополнительные маршруты или выставлять .mvc на свой пользователей.

Я написал об этом здесь: http://www.flux88.com/UsingASPNETMVCOnIIS6WithoutTheMVCExtension.aspx

и Стив Сандерсон тоже неплохой пост: http://blog.codeville.net/2008/07/04/options-for-deploying-aspnet-mvc-to-iis-6/

Ответ 4

Как упоминалось в этом сообщении в блоге Фила Хэка, можно настроить URL-адреса без расширения для ASP.NET MVC в IIS 6 используя сопоставление приложений подстановки:

  • В IIS 6 перейдите в Свойства конфигурации приложения для веб-приложения ASP.NET MVC.
  • Нажмите "Вставить..." в разделе "Карты подстановочных знаков".
  • Установите исполняемый файл в путь aspnet_isapi.dll(на моей машине это c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll).
  • Убедитесь, что НЕ проверять флажок "Проверить, существует ли файл" и нажмите "ОК".

Однако, как упоминалось также Hack, это может повлиять на производительность.

Ответ 5

С IIS6 вы можете сделать одну из двух вещей:

Так как опция 1 недоступна на большинстве веб-хостов, вам нужно перейти на номер 2.

Ответ 6

Переработка URL-адресов может помочь вам решить проблему. Я реализовал решение, позволяющее развертывать приложение MVC в любой версии IIS, даже если используется виртуальный хостинг. http://www.codeproject.com/KB/aspnet/iis-aspnet-url-rewriting.aspx

Ответ 7

У меня есть пример приложения на IIS6.

Я нашел быстрое и грязное решение. (Грязный, потому что он содержит имя по умолчанию с расширением). Он не требует дополнительного маршрута или чего-то особенного. (Кроме того, ваш маршрут по умолчанию должен иметь {controller}.aspx/{действие}... формат)

Здесь default.aspx

<%@ Page Language="C#"%>
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
    HttpContext.Current.RewritePath("~/Home.aspx/index");
    IHttpHandler httpHandler = new MvcHttpHandler();
    httpHandler.ProcessRequest(HttpContext.Current);
}
</script>

Мои примерные действия по умолчанию для приложений были индексом, в Домашнем каталоге.

Примечание. Я видел этот код в блоге Phil Haack. Благодаря Брайану Лоу.