ASP.NET MVC на IIS6
-
09-06-2019 - |
Вопрос
Где я могу найти несколько полезных советов по передовым методам работы 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 , пожалуйста.
Решение
Это заняло у меня немного времени, но я понял, как заставить расширения работать с 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 на контроллере.
Другие советы
Поскольку вы не можете изменить настройки IIS для сопоставления .mvc с ASP.Net, вы можете использовать другое расширение, которое уже сопоставлено с ASP.Net. Например, вы можете использовать {controller} .ashx / {action}, и это должно работать из коробки на IIS 6.
Вам не нужно мириться с этим расширением, если вы можете установить фильтр 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/
Как уже упоминалось в этом сообщение в блоге Фила Хака, можно настроить URL-адреса без расширений для ASP.NET MVC в IIS 6, используя сопоставления с подстановочными знаками приложений :
<Ол>Однако, как уже упоминал Хак, это может сказаться на производительности.
С IIS6 вы можете сделать одну из двух вещей:
<Ол>Переписывание URL может помочь вам решить проблему. Я реализовал решение, позволяющее развернуть приложение MVC на любой версии IIS даже при использовании виртуального хостинга. http://www.codeproject.com/KB/aspnet/ МИС-САШ-URL-rewriting.aspx
У меня есть пример приложения на 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 в Домашнем каталоге.
Примечание. Я видел этот код в блоге Фила Хаака. Спасибо Брайану Лоу.
У меня есть подробное пошаговое руководство, но оно требует использования isapi_rewrite. Просмотрите его по адресу: http://biasecurities.com/blog/2008/how-to-enable-pretty-urls-with-asp-net-mvc-and-iis6/ р>