удаление default.aspx и // www из URL - PullRequest
1 голос
/ 31 мая 2010

код для удаления /Default.aspx и //www не работает (как и ожидалось):

protected void Application_BeginRequest(object sender, EventArgs e)
        {
            HttpContext context = HttpContext.Current;
            string url = context.Request.RawUrl.ToString();

            bool doRedirect = false;

            // remove > default.aspx
            if (url.EndsWith("/default.aspx", StringComparison.OrdinalIgnoreCase))
            {
                url = url.Substring(0, url.Length - 12);
                doRedirect = true;
            }

            // remove > www
            if (url.Contains("//www"))
            {
                url = url.Replace("//www", "//");
                doRedirect = true;
            }

            // redirect if necessary
            if (doRedirect)
            {
                context.Response.Redirect(url);
            }
        }

обычно это работает, но при отправке формы (например, войдите в систему) приведенный выше код перехватывает запрос, а затем выполняет перенаправление на ту же страницу. пример:

  1. попробуйте прийти на страницу: ~/SignIn/Default.aspx
  2. запросы перехватываются и фиксируются на: ~/SignIn/
  3. заполните форму, нажмите "Войти"
  4. текущий URL-адрес страницы изменяется с: ~/SignIn/ до ~/SignIn/Default.aspx и снова исправляется, что отменяет обработку метода SignIn (который перенаправил бы браузер на /SignIn/Success/), и страница перезагружалась ~/SignIn/ и вход не выполнен.

пожалуйста, помогите. не уверен что / как тут исправить.

Основное требование здесь:

удалить /Default.aspx и //www из URL

Thnx

1 Ответ

1 голос
/ 31 мая 2010

Ваша проблема здесь связана с запросами GET и POST. Когда вы звоните Response.Redirect, вы указываете клиенту сделать новый запрос GET на указанный вами URL. Таким образом, если вы вызываете это рано в запросе, как обратный запрос формы, который на самом деле был запросом POST, вы потеряете сообщение. Поскольку большинство POST должны сами перенаправлять после завершения действия, может быть достаточно просто применить вышеописанную логику к GET-запросу.

Вы можете получить доступ к методу запроса (GET или POST), используя Request.HttpMethod.

...