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.
Ответы
Ответ 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 вы можете сделать одну из двух вещей:
- Настройка фильтра ISAPI для сопоставления URL-адресов MVC для ASP.NET
- Включить расширение в URL. Например: htp://localhost/Home.mvc
Так как опция 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. Благодаря Брайану Лоу.
Ответ 8
У меня есть подробное пошаговое руководство, но для этого требуется использовать isapi_rewrite. Просмотрите его по адресу: http://biasecurities.com/blog/2008/how-to-enable-pretty-urls-with-asp-net-mvc-and-iis6/