Почему RewritePath изменяет URL-адрес браузера? - PullRequest
2 голосов
/ 30 сентября 2011

У меня есть ASP.NET 4 HttpModule (см. Код ниже).Когда путь URL начинается с "/1.0", я хочу, чтобы Cassini / IIS перешел на MyService.svc.Тем не менее, я не хочу показывать «MyService.svc» пользователю (то есть не обновлять URL в браузере).Я хочу, чтобы пользователь увидел "www.something.com/1.0".

Я был почти уверен, что RewriteUrl не должен изменять URL браузера, но в моем случае это так.Есть идеи почему?

    public void Init(HttpApplication context)
    {
        context.BeginRequest +=
            delegate
            {
                HttpContext ctx = HttpContext.Current;
                const string BasePath = "~/1.0";
                if (path.StartsWith(BasePath, StringComparison.OrdinalIgnoreCase))
                {
                    ctx.RewritePath("~/MyService.svc", "this/is/a/path", string.Empty, false);
                }
            };
    }

PS Я не могу использовать маршрутизацию ASP.NET из-за точки / точки в URL (см. Идентификаторы маршрутов ASP.NET MVC с периодом ).

Ответы [ 2 ]

1 голос
/ 30 сентября 2011

Похоже, у вас та же проблема, что и здесь: ASP.NET RewritePath не работает должным образом / URL-адрес в браузере меняется

Добавьте косую черту в URL:

ctx.RewritePath("~/MyService.svc/", "this/is/a/path", string.Empty, false);

Кроме того, я не уверен, сохранит ли механизм WCF PathInfo для вас.Возможно, вам придется передать параметры с URL-адресом как QueryString.

0 голосов
/ 30 сентября 2011

Вам нужна URL-маршрутизация ASP.NET, и она доступна с .NET 3.5 SP1.

В вашем случае, я думаю, что вместо "переписывания" проще "проложить маршрут", и его проще использовать.

Почему? MSDN сказал это:

В маршрутизации ASP.NET вы определяете шаблоны URL, содержащие заполнители для значений, которые используются при обработке запросов URL. Во время выполнения, части URL, следующие за именем приложения, разбираются на дискретные значения, основанные на шаблоне URL, который вы определили. За Например, в запросе на http://server/application/Products/show/beverages, парсер маршрутизации может передать значения Продукты, шоу и напитки обработчику для запрос. Напротив, в запросе, который не управляется маршрутизацией URL, фрагмент / Продукты / шоу / напитки будет интерпретирован как путь файла в приложении.

Вы также можете использовать шаблоны URL для программного создания URL, которые соответствуют маршрутам. Это позволяет вам централизовать логику для создание гиперссылок в вашем приложении ASP.NET.

Маршрутизация ASP.NET и перезапись URL

Маршрутизация ASP.NET отличается от других схем перезаписи URL. URL перезапись обрабатывает входящие запросы путем фактического изменения URL перед отправкой запроса на веб-страницу. Например, приложение, использующее перезапись URL, может изменить URL с / Продукты / Виджеты / to /Products.aspx?id=4. Также перезапись URL как правило, не имеет API для создания URL-адресов, основанных на ваши шаблоны. При изменении URL-адреса, если вы измените шаблон URL, вы должны вручную обновите все гиперссылки, содержащие исходный URL.

При маршрутизации ASP.NET URL-адрес не изменяется при входящем запросе. обрабатывается, потому что маршрутизация может извлекать значения из URL. Когда ты необходимо создать URL, вы передаете значения параметров в метод, который генерирует URL для вас. Чтобы изменить шаблон URL, вы измените его в одно местоположение, и все ссылки, которые вы создаете в приложении которые основаны на этом шаблоне, будут автоматически использовать новый шаблон.

См. Маршрутизация ASP.NET в библиотеке MSDN.

...