Страница не перенаправляет должным образом, перезапись URL (Asp.NET) - PullRequest
0 голосов
/ 23 марта 2011

Я работаю над перезаписью URL, и я нашел один учебник на сайте asp.net, способ, которым я делаю это:

URL, который я ввожу http://localhost:1573/WebNew/web/first-web

Теперь я написалодин класс

public class FixURLs : IHttpModule 
{
    public FixURLs()
    {
        //
        // TODO: Add constructor logic here
        //
    }

    #region IHttpModule Members

public void Dispose()
{
    // do nothing
}

public void Init(HttpApplication context)
{
    context.BeginRequest += new EventHandler(context_BeginRequest);
}

#endregion

void context_BeginRequest(object sender, EventArgs e)
{
    HttpApplication app = (HttpApplication)sender;

    /*// checking page extension
    switch (System.IO.Path.GetExtension(app.Request.Url.AbsoluteUri.ToLower()))
    {
        case ".bmp":
        case ".gif":
        case ".jpg":
        case ".jpe":
        case ".jpeg":
        case ".png":
        case ".css":
        case ".js":
        case ".txt":
        case ".swf":
            // don't redirect, these requests may required in many cases
            return;
            break;
    }*/

    if (app.Request.RawUrl.ToLower().Contains("/web/"))
    {
        **if (app.Request.RawUrl.ToLower().Contains(".png")
              || app.Request.RawUrl.ToLower().Contains(".gif")
              || app.Request.RawUrl.ToLower().Contains(".js"))
        {
            return;
        } **
        DatabaseLayer dbLayer = new DatabaseLayer();

        string urlFromBrowser = app.Request.RawUrl.ToLower();
        string[] urlFormat = urlFromBrowser.Split('/');
        urlFromBrowser = urlFormat.GetValue(2).ToString() + "/" + urlFormat.GetValue(3).ToString();

        int WebId = dbLayer.GetWebURLId(urlFromBrowser.Trim());

        app.Context.RewritePath("Default.aspx", "", "WebId="+WebId);

    }
}

Но проблема в том, что он не перенаправляет на страницу Default.aspx.

Я получаю следующую ошибку:

Описание: HTTP404. Ресурс, который вы ищете (или одна из его зависимостей), мог быть удален, изменилось его имя или временно недоступен.Пожалуйста, просмотрите следующий URL и убедитесь, что он написан правильно.

Запрошенный URL: /WebNew/web/Default.aspx

Я вижу, что он запрашивает URL /webNew/web/Default.aspx, но мне просто нужен /webnew/default.aspx? WebId = 2

Пожалуйста, помогите мне

РЕДАКТИРОВАТЬ

Спасибо за ответ, но я не могу принять ни ваш ответ, ни кнопку комментарияработает на меня, вот почему я редактирую свой пост.Я получаю ошибку JavaScript: объект ожидается, и вопрос объекта является нулевым.enter image description here

@ Waqas Raja Спасибо за ваш ответ, теперь он работает нормально.Но когда я установил точку останова в событии (! IspostBack) страницы Default.aspx, я увидел, что она возникает около 8 раз.После загрузки страницы несколько изображений пропали.Многократное обновление - проблема?Любая идея, почему это происходит снова и снова к событию if (! IsPostBack).Спасибо за вашу помощь

EDIT1

@ Waqas Raja Я приму ваш ответ после входа в систему из другого браузера.

EDIT2

@ Waqas Raja Я показываю изображение на своей домашней странице вот так

Есть несколько других изображений, которые также отображаются таким образом, все они приходятправильно при загрузке, но когда я использую переписывание URL, я вижу только альтернативный текст.

Я пробовал это также

, но тот же результат.:-( Любое предложение?

Проверяя необработанный URL-адрес, я вижу, что есть много запросов, кроме страницы, т.е. jpg, .js, как вы упомянули. Я обновил код, это правильно?потому что я не могу видеть изображения и некоторые функции javascript.

EDIT3

@ Waqas Raja Большое спасибо за вашу помощь. Теперь я могу видеть изображения. Яудалил HTML-изображение в asp: Image controla и сохранив ImageURL как ~ / images / facebook_icon.png.

Но я все еще не вижу эффектов файла JS на странице, я поставил src = "~ /JS / jQuery.js ", но он все еще не работает. Я поместил код, упомянутый вами, в моем классе [именно там, где вы меня вели).

1 Ответ

1 голос
/ 23 марта 2011

Проблема связана с вашим путем перезаписи, замените его следующим:

app.Context.RewritePath("~/webnew/Default.aspx", "", "WebId=" + WebId);

Редактировать 1 Ваши требования были изменены, однако позвольте мне попытаться объяснить, что происходит не так.

Проблема должна быть с вашими относительными путями изображений, а также это может произойти в случае внешнего javascript и css.

Вы должны использовать путь относительно вашего корневого каталога.

~ относится к корневому каталогу виртуального каталога, к ресурсу которого (обычно страницы или иногда внешнего css) обращаются.

~/pathToImagesFolder/imageName.ext

Будьте осторожны при включении javascript и css и использованиипуть относительно домашней директории вашего сайта или виртуальной директории.Однако внутри CSS нет никаких шагов, которые необходимо предпринять в этом отношении.

Относительно IsPostBack проблемы

Я предполагаю, что проблема связана с вашим условием if

if (app.Request.RawUrl.ToLower().Contains("/web/"))

Здесь вы перенаправляете любой запрос, который содержит /web/ в URL, и, скорее всего, внутри вашей страницы вы обращаетесь к некоторым ресурсам, таким как изображения или внешние css или js, которые содержат /web/ в их URL, и поэтому, когда запрос достигает, он перенаправляется наdefault.aspx и проблема возникает.Вы можете подтвердить это, посмотрев на Request.RawUrl в Page_Load событии Default.aspx

Итак, вам нужно больше проверок при сравнении запрошенного пути ресурса и перенаправления.Красивее было бы, если вы проверяете и пропускаете перенаправление всех URL, которые заканчиваются расширениями вроде .css .jpg .JPG .js .gif и т. Д.

. Надеюсь, ваше понимание будет построено сейчас.нужно пропустить все остальные расширения

// checking page extension
switch (System.IO.Path.GetExtension(app.Request.Url.AbsoluteUri.ToLower()))
{
    case ".bmp":
    case ".gif":
    case ".jpg":
    case ".jpe":
    case ".jpeg":
    case ".png":
    case ".css":
    case ".js":
    case ".txt":
    case ".swf":
        // don't redirect, these requests may required in many cases
        return;
        break;
}
...