ASP.NET MVC на IIS6 - PullRequest
       47

ASP.NET MVC на IIS6

25 голосов
/ 29 августа 2008

Где можно найти несколько полезных советов по передовым методам работы ASP.NET MVC на IIS6?

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

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

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

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

Ответы [ 8 ]

14 голосов
/ 25 ноября 2008

Это заняло у меня немного времени, но я понял, как заставить расширения работать с 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]/ оба снова начнут работать, я думаю, потому что они были успешно сопоставлены с контроллером Home. Итак, полное решение:

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 на контроллере.

7 голосов
/ 30 августа 2008

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

4 голосов
/ 21 июня 2009

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

  1. В IIS 6 перейдите в Свойства конфигурации приложения для веб-приложения ASP.NET MVC.
  2. Нажмите «Вставить ...» в разделе карт приложения Wildcard.
  3. Установите для исполняемого файла путь aspnet_isapi.dll (на моем компьютере это c: \ windows \ microsoft.net \ framework \ v2.0.50727 \ aspnet_isapi.dll).
  4. Убедитесь, что НЕ проверили «Убедитесь, что файл существует» и нажмите «ОК».

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

4 голосов
/ 29 августа 2008

Вам не нужно жить с этим расширением, если вы можете установить 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/

2 голосов
/ 29 августа 2008

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

  1. Настройка фильтра ISAPI для сопоставления URL-адресов MVC с ASP.NET
  2. Включить расширение в URL . Например: htp: //localhost/Home.mvc

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

1 голос
/ 24 ноября 2009

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

0 голосов
/ 22 апреля 2010

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

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

Здесь 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>

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

Примечание: я видел этот код в блоге Фила Хаака. Благодаря Брайану Лоу.

0 голосов
/ 03 сентября 2008

У меня есть подробное пошаговое руководство, но оно требует использования isapi_rewrite. Посмотреть по адресу: http://biasecurities.com/blog/2008/how-to-enable-pretty-urls-with-asp-net-mvc-and-iis6/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...