2009-07-09 2 views
2

Ich verengere mich auf ein zugrunde liegendes Problem im Zusammenhang mit twoprior Fragen.Wie unterscheidet sich HttpWebRequest (funktional) vom Einfügen einer URL in eine Adressleiste?

Grundsätzlich habe ich eine URL, die, wenn ich es manuell abholen (Einfügen in den Browser) funktioniert gut, aber wenn ich durch Code (mit dem HttpWebRequest) durchlaufen, hat ein anderes Ergebnis.

Die URL (Beispiel):

 
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 

Der Code:

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) ... 

Also, wie kann ich von einem Server GET eine URL angegeben? Ich mache hier offensichtlich etwas falsch, kann aber nicht sagen was.

Entweder ein Fix für meinen Code, oder ein alternativer Ansatz, der tatsächlich funktioniert, wäre in Ordnung. Ich bin überhaupt nicht verheiratet mit der HttpWebRequest-Methode.

+0

Dies ist nicht [Web-Entwicklung], es ist eine Desktop-App. BitTorrent um genau zu sein. –

Antwort

2

Nun, die einzigen, die sie unterscheiden können, ist in den HTTP-Headern, die übertragen werden. Insbesondere der User-Agent.

Warum verwenden Sie auch einen WebProxy? Das ist nicht wirklich notwendig und wird wahrscheinlich nicht von Ihrem Browser verwendet.

Der Rest Ihres Codes ist in Ordnung .. Stellen Sie nur sicher, dass Sie die HTTP-Header richtig einrichten. Überprüfen Sie this link aus:

Ich würde vorschlagen, dass Sie sich eine Kopie von WireShark erhalten und untersuchen Sie die Kommunikation zwischen Ihrem Browser und dem Server, auf den Sie zugreifen möchten. Dies wird mit WireShark eher trivial und zeigt Ihnen die genaue HTTP-Nachricht, die vom Browser gesendet wird.

Dann nehmen Sie einen Blick auf die Kommunikation, die zwischen Ihrem C# Anwendung geht auf und der Server (wieder mit Wireshark) und vergleichen dann die beiden, um herauszufinden, was genau unterscheidet.

Wenn die Kommunikation ist eine reine HTTP-GET-Methode (dh es gibt keine Körper HTTP-Nachricht beteiligt ist), und die URL korrekt ist dann die einzigen beiden Dinge, die ich von sind einfiel:

  1. sicherstellen, dass Ihre sind das richtige Protokoll senden (zB HTTP/1.0 oder HTTP/1.1 oder was auch immer es ist, dass Sie das senden sollte)
  2. stellen Sie sicher, dass Sie alle erforderlichen HTTP-Header korrekt, senden und offensichtlich, dass Sie alle HTTP-Header senden nicht, dass Du solltest nicht senden.
+0

Tatsächlich verwendet der Browser wahrscheinlich die Standard-Proxy-Einstellungen, und er verwendet einen Null-Proxy. –

+0

@John Saunders, mein Punkt ist, dass es nicht erforderlich ist und so versuchte, Unbekannte auf ein Minimum zu beschränken, konnte er es aus dem Code entfernen. –

+0

Funktion ist identisch, ob WebProxy-Code enthalten ist oder nicht. Der Originalcode wurde weggelassen und es wurde (über einige Tutorials) als "Voodoo" -Fehler für das Problem vorgeschlagen. –

0

Es könnte etwas mit der URL sein. Statt einen String zu verwenden, ist es in der Regel besser, eine Instanz von System.Uri zu verwenden:

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 
    } 
} 
+0

Ich bin mir ziemlich sicher, dass HttpWebRequest.Create (string) es nur intern in ein Uri verwandelt. Trotzdem habe ich deinen Vorschlag vergeblich versucht. –

+0

Ok, die nächsten paar Schritte wären, den Proxy loszuwerden und nebenbei den Verkehr mit Fiddler zu beobachten. –

3

Ich empfehle Sie Fiddler sowohl den „in Web-Browser einfügen“ zu verfolgen, verwenden Anruf und den HttpWebRequest Anruf.

Sobald Sie verfolgt werden können Sie sehen alle Unterschiede zwischen ihnen, ob sie Unterschiede in der Anfrage URL, in den Formularheadern, usw., usw.

Es kann sich wirklich lohnen, die rohen Anfragen von beiden (von Fiddler) hier einzufügen, wenn Sie nichts Offensichtliches sehen können.

+0

In Fiddler können Sie die Arbeitsanforderung und die nicht funktionierende Anforderung auswählen, mit der rechten Maustaste klicken und "Vergleichen" wählen. WinDiff öffnet und ermöglicht Ihnen, die rohe Anfrage und Antwort zu vergleichen. – EricLaw

0

Ich denke, Sie müssen genau sehen, was zu Ihrem Server in der HTTP-Anfrage fließt. Klingt wahrscheinlich, dass die Header interessant anders sind.

Sie können eine Art Debugging-Proxy zwischen Ihrer Anfrage und dem Server einführen (RAD hat beispielsweise eine solche Funktion in der Box).