Почему RewritePath изменяет URL-адрес браузера?

У меня есть HttpModule ASP.NET 4 (см. Код ниже). Когда путь 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);
                }
            };
    }

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


person Martin    schedule 30.09.2011    source источник


Ответы (2)


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

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

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

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

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

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

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

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

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

person Eriawan Kusumawardhono    schedule 30.09.2011
comment
Я не могу использовать маршрутизацию ASP.NET. Точка в URL не поддерживается. - person Martin; 30.09.2011
comment
Что значит период в URL? Не могли бы вы рассказать подробнее? - person Eriawan Kusumawardhono; 30.09.2011
comment
В Stackoverflow есть этот действительный URL-адрес и период: stackoverflow.com/questions/tagged/asp.net - person Eriawan Kusumawardhono; 30.09.2011

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

Добавьте завершающую косую черту к URL-адресу:

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

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

person Artem Koshelev    schedule 30.09.2011