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, пожалуйста.


person Seb Nilsson    schedule 29.08.2008    source источник
comment
Спасибо за этот вопрос - я, к счастью, наткнулся на него, прежде чем потратить кучу времени на новый проект в MVC, который должен работать под IIS6. Хорошо знать, что это проблема, пока я не зашел слишком далеко ...   -  person cori    schedule 03.10.2008


Ответы (8)


Это заняло у меня немного времени, но я понял, как заставить расширения работать с 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://[websitepting/ перестают работать правильно. Так как это исправить?

Что ж, вам нужно определить второй маршрут. К сожалению, использование 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://[websitepting/ снова начнут работать, я думаю, потому что они успешно сопоставляются с домашним контроллером. Итак, полное решение:

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

person Community    schedule 25.11.2008
comment
помните, если вы когда-нибудь решите переключиться на IIS7 и удалить .aspx, тогда ваша SEO будет испорчена. вам нужно будет сохранить устаревшую маршрутизацию, чтобы вас можно было «найти» в будущем - person Simon_Weaver; 22.01.2009
comment
Этот второй маршрут просто должен быть корневым маршрутом с пустым значением URL: routes.MapRoute (Root ,, new {controller = Home, action = Index, id =}); - person Scott; 02.03.2010

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

person Sean Carpenter    schedule 30.08.2008
comment
И самый удачный, учитывая ОП. Какого черта люди? - person Chris; 27.11.2008

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

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

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

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

person Ben Scheirman    schedule 29.08.2008

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

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

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

person PropellerHead    schedule 21.06.2009
comment
Из blog.stevensanderson. com: оказывается, вы можете отключить карты с подстановочными знаками в выбранных подпапках, что может дать вам лучшее из обоих миров. - person nickvane; 14.10.2011

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

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

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

person Espo    schedule 29.08.2008

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

person Alex Ilyin    schedule 24.11.2009

У меня есть образец приложения на 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 в домашнем каталоге.

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

person anov    schedule 21.04.2010

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

person Jim Geurts    schedule 02.09.2008