2009-07-09 26 views
2

我正在缩小与twoprior问题有关的潜在问题。HttpWebRequest如何将URL粘贴到地址栏中(功能性)有所不同?

基本上,我有一个URL,当我手动获取它(将其粘贴到浏览器中)时工作得很好,但是当我运行一些代码(使用HttpWebRequest)时会得到不同的结果。

的网址(例如):

 
http://208.106.250.207:8192/announce?info_hash=-%CA8%C1%C9rDb%ADL%ED%B4%2A%15i%80Z%B8%F%C&peer_id=&port=6881&uploaded=0&downloaded=0&left=0&compact=0&no_peer_id=0&event=started 

代码:

String uri = BuildURI(); //Returns the above URL 
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(uri); 
req.Proxy = new WebProxy(); 
WebResponse resp = req.GetResponse(); 
Stream stream = resp.GetResponseStream(); 
... Parse the result (which is an error message from the server claiming the url is incorrect) ... 

所以,我怎样才能从给定的URL的服务器得到什么?我显然在这里做错了什么,但不知道是什么。

无论是我的代码修复,还是实际工作的替代方法都可以。我根本就不喜欢HttpWebRequest方法。

+0

这不是[网页开发],它是一个桌面应用程序。 BitTorrent是精确的。 – 2009-07-09 22:46:28

回答

2

那么,他们唯一不同的地方就是在传输的HTTP头文件中。特别是用户代理。

另外,你为什么使用WebProxy?这不是真的必要,它很可能不会被您的浏览器使用。

其余的代码很好..只要确保你正确设置了HTTP头。检查this link出:

我建议你自己复制一份WireShark,并检查浏览器和你试图访问的服务器之间的通信。使用WireShark这样做将会非常微不足道,它会向您显示从浏览器发送的确切HTTP消息。

然后看看你的C#应用​​程序和服务器之间的通信(再次使用WireShark),然后比较两者,找出究竟有什么不同。

如果通信是一个纯HTTP GET方法(即不涉及HTTP消息体)和URL是正确的,那么唯一的两件事我能想到的是:

  1. 确保您的发送正确的协议(例如,HTTP/1.0或HTTP/1.1或任何你应该发送的内容)
  2. 确保你正确地发送了所有必需的HTTP头,显然你没有发送任何HTTP头你不应该发送。
+0

实际上,浏览器可能使用默认的代理设置,并且他使用的是空代理。 – 2009-07-09 22:49:32

+0

@约翰桑德斯,我的观点是,这不是必需的,所以在试图将未知数降到最低限度时,他可以将其从代码中移除。 – 2009-07-09 22:53:05

+0

无论WebProxy代码是否包含,功能都是相同的。原始代码省略了它,并且已经建议(通过一些教程)作为该问题的“巫术”修复。 – 2009-07-09 22:57:25

0

URL可能有问题。而不是使用一个字符串,它通常是更好地使用的System.Uri实例:

String url = BuildURI(); //Returns the above URL 
Uri uri = new Uri(url); 
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url); 
req.Proxy = new WebProxy(); 
using (WebResponse resp = req.GetResponse()) { 
    using (Stream stream = resp.GetResponseStream()) { 
     // whatever 
    } 
} 
3

我建议你使用Fiddler跟踪两个“粘贴到网页浏览器”的呼叫和通话的HttpWebRequest。

一旦追踪到,您将能够看到它们之间的之间的任何区别,无论它们是请求url,表单标题等中的差异。

如果你看不到任何明显的东西,它可能实际上是值得粘贴这两者的原始请求(从Fiddler获得)。

0

我想你需要在HTTP请求中确切地看到流向服务器的内容。声音听起来很可能是标题有趣的不同。

您可以在您的请求和服务器之间引入某种调试代理(例如RAD在框中具有这种功能)。