На сайте MVC вы можете установить приоритет модуля перезаписи Url в IIS, чтобы переопределить маршруты MVC? - PullRequest
2 голосов
/ 14 апреля 2011

У меня есть сайт MVC, на котором есть маршруты, которые мне нужно перенаправить с помощью модуля IIS Url ReWrite, поскольку я не могу перестроить сайт (не спрашивайте).Поэтому я подумал, что мог бы использовать IIS Url ReWriter и ввести некоторые значения web.config для выполнения перенаправления.Проблема в том, что сначала обрабатывается маршрут MVC, и поэтому модуль перезаписи URL никогда не срабатывает.

есть ли способ сделать Url ReWriter первым обработчиком, а затем вернуться к маршрутизации MVC?

Моя среда - MVC2 c # Asp.NET 3.5 на IIS 7.5 Win Server 2008 R2

Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 21 апреля 2011

ОК, поэтому я обнаружил, что не могу сделать это без создания HttpModule. Простая вещь, которую нужно сделать, создать код для модуля с помощью IHttpModule, а затем зарегистрировать его в веб-конфигурации следующим образом:

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>
0 голосов
/ 16 апреля 2011

Вы можете добавить любой код в ваш global.asax перед добавлением маршрутизации URL.

...