WebRequest从Uri中删除Fragment

时间:2011-08-24 18:59:22

标签: c# httpwebrequest uri fragment-identifier

我想打开以下页面:

  

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类打开它时,它会从网址中删除“Fragment”(在这种情况下不是Uri片段),并尝试打开以下网址:

  

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

如何准确打开该网址?

我尝试编码#字符,但这似乎不起作用。

修改
我知道URL是什么,片段是什么,以及所有这些。我问的是,是否有办法覆盖Uri类的功能。 (要获取Uri,删除#之后的内容并将其放在Fragment属性中等),这样我就可以查询该网址,而不是修改后的网址。

5 个答案:

答案 0 :(得分:3)

虽然示例中的片段并不完全符合片段的设计要求,但它仍然向浏览器提供客户端数据,以便在页面初始加载后执行操作。如果您在点击链接时仔细观察,您会看到页面标题以“dvd player”(从原始查询字符串开始)开始,但在页面从服务器加载后更改为“汽车扬声器”客户端脚本执行。

答案 1 :(得分:1)

据我所知,#表示一个片段(通常是网页中的一个锚点)并且实际上不是URL的一部分,它只是将浏览器带到页面的特定部分,并在客户端上处理只是。

换句话说,它不是URI请求的一部分。

  

片段标识符的功能与其余部分不同   URI:即,它的处理是专门的客户端,没有   来自服务器的参与 - 当然服务器通常有帮助   确定MIME类型,并确定MIME类型   处理碎片。

     

当代理(例如Web浏览器)时   从Web服务器请求资源,代理将URI发送到   服务器,但不发送片段。相反,代理等待   服务器发送资源,然后代理处理   资源根据文档类型和片段值。

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

答案 2 :(得分:1)

这是一个奇怪的问题,因为fragment实际上不应该被服务器解析。但是,在您的示例网址中,片段肯定正在被使用(可能在谷歌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上使用,而不是服务器端。

更好的想法可能是了解google的Url's,即你的Uri应该是:

http://www.google.com/search?q=car+speaker&hl=en&tbs=cat:895,price:1,ppr_min:50&tbm=shop

答案 3 :(得分:0)

片段是客户端机制,因此在服务器上没有用处。您传回服务器的任何数据都在查询字符串中,那么您尝试将片段传回后会有什么好处呢?

答案 4 :(得分:0)

如果您需要在客户端使用此变量,则可以使用此javascript代码

 <script>
 if(window.location.hash) {
    console.log(window.location.hash); 
    window.location.hash = window.location.hash;
 } 
</script>