Можете ли вы на сайте MVC установить приоритет модуля перезаписи URL в IIS для переопределения маршрутов MVC?

#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.