#c# #asp.net-mvc #iis #routing #url-rewriting
#c# #asp.net-mvc #iis #маршруты #перезапись URL
Вопрос:
У меня есть сайт MVC, на котором есть маршруты, которые мне нужно перенаправить с помощью модуля перезаписи URL IIS, поскольку я не могу перестроить сайт (не спрашивайте). Итак, я подумал, что мог бы использовать IIS Url ReWriter и ввести некоторые значения web.config для выполнения перенаправления. Проблема в том, что маршрут MVC обрабатывается первым, и поэтому модуль перезаписи URL никогда не запускается.
есть ли способ сделать перезапись URL первым обработчиком, а затем вернуться к маршрутизации MVC?
Моя среда — MVC2 c # Asp.NET 3.5 на IIS 7.5 Win Server 2008 R2
Спасибо за любую помощь.
Комментарии:
1. ASP.NET 2.0, 4.0? Какая версия MVC? Сайт работает в классическом или более интегрированном режиме? Вам следует указать эту информацию в вопросе, поскольку для быстрого воспроизведения очень важно знать свою среду.
2. работает ли пул в классическом режиме или в режиме интегрированного конвейера?
Ответ №1:
ХОРОШО, я обнаружил, что не могу этого сделать без создания HttpModule. На самом деле сделать это просто: создать код для модуля с помощью IHttpModule, а затем зарегистрировать его в web config следующим образом:
public class HttpRedirectModule: IHttpModule
{
public HttpRedirectModule()
{
}
public void Init(HttpApplication context)
{
context.BeginRequest = new EventHandler(ContextBeginRequest);
}
void ContextBeginRequest(object sender, EventArgs e)
{
var application = (HttpApplication) sender;
if (application.Application["Redirects"] == null)
{
var repository = Factory.GetInstance<IRepository>();
application.Application["Redirects"] = repository.GetAll<Redirect>();
}
var redirects = (IList<Redirect>) application.Application["Redirects"];
if (application.Request.Url.AbsolutePath != "/default.aspx")
{
foreach (var redirect in redirects)
{
var regex = new Regex(redirect.FromPath);
Match match = regex.Match(application.Request.Url.AbsolutePath);
if (match.Success)
{
application.Response.Clear();
if (redirect.StatusCode == 301)
{
application.Response.Status = "301 Moved Permanently";
application.Response.StatusCode = 301;
}
else
{
application.Response.Status = "302 Moved temporarily";
application.Response.StatusCode = 302;
}
application.Response.AddHeader("Location", redirect.ToPath);
application.Response.End();
}
}
}
}
public void Dispose()
{
}
}
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<remove name="RedirectsModule" />
<add name="RedirectsModule" type="MyCode.HttpModules.HttpRedirectModule, MyCode" />
</modules>
</system.webServer>
Ответ №2:
Вы можете добавить любой код в свой global.asax до добавления маршрутизации URL.