Чем HttpWebRequest отличается (функционально) от вставки URL-адреса в адресную строку? - PullRequest
2 голосов
/ 10 июля 2009

Я сужусь к основной проблеме, связанной с двумя предыдущими вопросами.

По сути, у меня есть URL, который, когда я извлекаю его вручную (вставляю в браузер), работает нормально, но когда я запускаю какой-то код (используя HttpWebRequest), результат получается другим.

URL (пример):

http://208.106.250.207:8192/announce?info_hash=-%CA8%C1%C9rDb%ADL%ED%B4%2A%15i%80Z%B8%F%C&peer_id=01234567890123456789&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.

Ответы [ 4 ]

3 голосов
/ 10 июля 2009

Я рекомендую использовать Fiddler для отслеживания как вызова «вставка в веб-браузер», так и вызова HttpWebRequest.

После отслеживания вы сможете увидеть любые различия между ними, будь то различия в URL-адресе запроса, в заголовках форм и т. Д. И т. Д.

Возможно, здесь стоит вставить необработанные запросы от обоих (полученных от Fiddler), если вы не видите ничего очевидного.

2 голосов
/ 10 июля 2009

Ну, единственное, что они могут отличаться - это заголовки HTTP, которые передаются. В частности, User-Agent.

Кроме того, почему вы используете WebProxy? Это на самом деле не нужно и, скорее всего, не используется вашим браузером.

С остальным кодом все в порядке. Просто убедитесь, что вы правильно настроили заголовки HTTP. Проверьте эту ссылку out:

Я бы посоветовал вам получить копию WireShark и проверить связь между вашим браузером и сервером, к которому вы пытаетесь получить доступ. Это будет довольно тривиально с помощью WireShark и покажет вам точное HTTP-сообщение, которое отправляется из браузера.

Затем взгляните на связь, которая происходит между вашим приложением C # и сервером (снова с помощью WireShark), а затем сравните их, чтобы выяснить, что именно отличается.

Если это чистый HTTP-метод GET (т. Е. Тело HTTP-сообщения не задействовано), а URL-адрес правильный, то я могу думать только о следующих двух вещах:

  1. убедитесь, что вы отправляете правильный протокол (т. Е. HTTP / 1.0 или HTTP / 1.1 или что-то еще, что вы должны отправлять)
  2. убедитесь, что вы отправляете все требуемые заголовки HTTP правильно, и, очевидно, что вы не отправляете заголовки HTTP, которые вам не следует отправлять.
0 голосов
/ 10 июля 2009

Я думаю, вам нужно точно узнать, что поступает на ваш сервер в HTTP-запросе. Похоже, что заголовки интересно разные.

Вы можете ввести своего рода прокси-сервер для отладки между вашим запросом и сервером (например, RAD имеет такую ​​возможность в поле).

0 голосов
/ 10 июля 2009

Возможно, что-то не так с 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...