WebRequest удаление фрагмента из Uri - PullRequest
1 голос
/ 24 августа 2011

Я хочу открыть следующую страницу:

http://www.google.com/search?q=dvd+player&tbm=shop&hl=en&aq=f#q=car+speaker+&hl=en&sa=X&ei=vbtSTqTPDKXniAKy0-iDAw&ved=0CC0QpwUoAA&tbs=cat:895%2Cprice%3A1%2Cppr_min%3A50%2Cppr_max%3A99.99&tbm=shop&tbo=&fp=1&biw=851&bih=426&cad=b&bav=on.2,or.r_gc.r_pw.

но когда я пытаюсь открыть его с помощью класса WebRequest, он удаляет «Фрагмент» (в данном случае это не Фрагмент Uri) из URL и вместо этого пытается открыть следующий URL:

http://www.google.com/search?q=dvd+player&tbm=shop&hl=en&aq=f

Как я могу открыть именно этот URL?

Я пытался кодировать символ #, но, похоже, это не работает.

Edit:
Я знаю, что такое URL, что это за фрагмент, и все это. Я спрашиваю, есть ли способ переопределить то, что делает класс Uri. (Взять Uri и удалить то, что после # и поместить его в свойство Fragment и т. Д.), Чтобы я мог запросить этот URL вместо измененного URL.

Ответы [ 5 ]

3 голосов
/ 25 августа 2011

Хотя фрагмент в вашем примере не выполняет в точности то, для чего предназначен этот фрагмент, он все же предоставляет данные на стороне клиента в браузер для принятия мер после первоначальной загрузки страницы.Если вы внимательно посмотрите на ссылку, вы увидите, что заголовок страницы начинается с «DVD-проигрывателя» (из исходной строки запроса), но затем изменяется на «автомобильный динамик» после загрузки страницы с сервера иклиентский скрипт выполняется.

1 голос
/ 24 августа 2011

Насколько я знаю, # представляет фрагмент (обычно якорь на веб-страницах) и на самом деле не является частью URL, он просто переносит браузер на определенную часть страницы и обрабатывается на клиенте только со стороны.

Другими словами, это не часть запроса URI.

Идентификатор фрагмента функционирует не так, как остальные URI: а именно, его обработка исключительно на стороне клиента без участие с сервера - конечно сервер обычно помогает определить тип MIME, а тип MIME определяет обработка фрагментов.

Когда агент (например, веб-браузер) запрашивает ресурс с веб-сервера, агент отправляет URI сервер, но не отправляет фрагмент. Вместо этого агент ждет сервер для отправки ресурса, а затем агент обрабатывает ресурс по типу документа и значению фрагмента.

http://www.w3.org/TR/webarch/#media-type-fragid

1 голос
/ 24 августа 2011

Странно, что fragment на самом деле не должен анализироваться сервером. Но в вашем примере url наиболее определенно используется фрагмент (может быть, в Google JS, на стороне клиента?)

Вот быстрый взлом, который, кажется, делает то, что вам нужно, кодируя весь запрос:

string str =
"http://www.google.com/search?q=dvd+player&tbm=shop&hl=en&aq=f#q=car+speaker+&hl=en&sa=X&ei=vbtSTqTPDKXniAKy0-iDAw&ved=0CC0QpwUoAA&tbs=cat:895%2Cprice%3A1%2Cppr_min%3A50%2Cppr_max%3A99.99&tbm=shop&tbo=&fp=1&biw=851&bih=426&cad=b&bav=on.2,or.r_gc.r_pw.";

string[] arr = str.Split( '?' );
string uriString = arr[0] + "?" + HttpUtility.UrlEncode( arr[1] );
var uri = new Uri( uriString );
var request = ( HttpWebRequest )WebRequest.Create( uri );

Редактировать
Оглядываясь назад, fragment используется на стороне клиента JS, а не на стороне сервера.

Лучшей идеей может быть понимание URL-адреса Google, т. Е. Ваш Uri должен быть:

http://www.google.com/search?q=car+speaker&hl=en&tbs=cat:895,price:1,ppr_min:50&tbm=shop
0 голосов
/ 22 февраля 2019

Если вам нужна эта переменная на стороне клиента, вы можете использовать этот код JavaScript

 <script>
 if(window.location.hash) {
    console.log(window.location.hash); 
    window.location.hash = window.location.hash;
 } 
</script>
0 голосов
/ 24 августа 2011

Фрагмент является механизмом на стороне клиента и поэтому не используется на сервере. Любые данные, которые вы передаете обратно на сервер, будут находиться в строке запроса, так какую выгоду вы видите от попытки передать фрагмент обратно?

...