Проблема WebRequest, ответ перед телом запроса - PullRequest
1 голос
/ 10 августа 2010

Я использую класс WebRequest в данных .net и POST для сервера, который отвечает с помощью Response.

Самое странное, что он работает, когда я запустил fiddler для анализа сетевого трафика, но без fiddler это не так.

Итак, я начал анализировать пакет, который отправляется на мой компьютер и с моего компьютера с помощью WireShark. С помощью этой программы легко следовать TCP-потоку. Поэтому, когда у меня была включена функция fiddler, я вижу, что правильный заголовок / тело запроса отправляется и получает заголовок / тело ответа. Странная часть: когда я не использую fiddler, отправляется заголовок запроса, затем я получаю заголовок / тело ответа и, наконец, тело запроса в конце потока TCP.

Вот мой код, который я разрабатывал:

string lcUrl = "http://XX.XX.XXX.XX";

        // *** Establish the request 

        HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(lcUrl);

        string lcPostData = testdata;

        loHttp.Method = "POST";

        byte [] lbPostBuffer = System.Text.Encoding.GetEncoding(1252).GetBytes(lcPostData);

        loHttp.ContentLength = lbPostBuffer.Length;

        loHttp.Credentials = CredentialCache.DefaultCredentials;

        //loHttp.SendChunked = true;

        loHttp.ServicePoint.Expect100Continue = false;

        Stream loPostData = loHttp.GetRequestStream();

        loPostData.Write(lbPostBuffer, 0, lbPostBuffer.Length);

        loPostData.Close();

        HttpWebResponse loWebResponse = (HttpWebResponse)loHttp.GetResponse();

        Encoding enc = System.Text.Encoding.GetEncoding(1252);

        StreamReader loResponseStream = new StreamReader(loWebResponse.GetResponseStream(), enc);

        string lcHtml = loResponseStream.ReadToEnd();

        loWebResponse.Close();

        loResponseStream.Close();

Ответы [ 2 ]

2 голосов
/ 10 августа 2010

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

string lcUrl = "http://XX.XX.XXX.XX";
// *** Establish the request 
HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(lcUrl);
string lcPostData = testdata;
loHttp.Method = "POST";
byte[] lbPostBuffer = System.Text.Encoding.GetEncoding(1252).GetBytes(lcPostData);
loHttp.ContentLength = lbPostBuffer.Length;
loHttp.Credentials = CredentialCache.DefaultCredentials;
//loHttp.SendChunked = true;
loHttp.ServicePoint.Expect100Continue = false;
using (Stream loPostData = loHttp.GetRequestStream())
{
     loPostData.Write(lbPostBuffer, 0, lbPostBuffer.Length);
}
string lcHtml;
using (HttpWebResponse loWebResponse = (HttpWebResponse)loHttp.GetResponse())
{
    Encoding enc = System.Text.Encoding.GetEncoding(1252);
    using (StreamReader loResponseStream = new StreamReader(loWebResponse.GetResponseStream(), enc))
    {
         lcHtml = loResponseStream.ReadToEnd();
    }               
}
// Perform processing of data here....

Также я могу предложить вам добавить следующий код в файл app.config для вашего приложения.Это полезно, когда сервер возвращает ответ, который не соответствует тому, как .NET обрабатывает HTTP-запрос.

<configuration>
 <system.net>
 <settings>
<httpWebRequest
useUnsafeHeaderParsing="true"
/>
</settings>
</system.net>
</configuration>
0 голосов
/ 11 августа 2010

У меня есть подозрение, что клиент ожидает ответа от сервера «HTTP / 1.1 100 continue». Вот как это работает. Когда вы отправляете данные на сервер, иногда сервер может быть еще не готов принять данные. Например, он сначала хочет аутентифицировать клиента.

Итак, когда вы отправляете запрос POST, клиент просто отправляет заголовки запроса с добавлением «Expect: 100-continue».

POST / url HTTP / 1.1 Сервер: имя сервера / fqdn Длина контента: 100 Ожидайте: 100-продолжить

Если сервер готов к приему данных, он отвечает:

HTTP / 1.1 100 продолжить Сервер: имя-сервера / fqdn

Теперь клиент может отправлять данные.

Однако, если сервер не готов к приему данных и хочет аутентифицировать клиента, он ответит другим кодом состояния.

Если вы отправите свой след от Wireshark на pastebin.com, я смогу проверить, но я подозреваю, что это именно то, что происходит.

Причина, по которой вы не видите этого в fiddler, может заключаться в том, что fiddler использует HttpListener для прослушивания HTTP-запроса, а HTTP-прослушиватель скрывает промежуточный ответ, такой как 100-continue от приложения (в данном случае fiddler).

...