Проблема WebRequest, ответ перед телом запроса

I'am с помощью класса WebRequest в .NET и данных POST к серверу, который отвечает Ответом.

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

Таким образом, я начал анализировать пакет, который отправляется в и от моего компьютера с WireShark. С в этой программе его простое для следования за потоком TCP. Таким образом, когда у меня был скрипач на, я вижу, что корректный Request-header/body отправляется и получает Response-header/body. Странная часть - когда я не использую скрипача, заголовок Запроса отправляется, затем у меня есть Response-header/body и наконец тело запроса в конце потока 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();
1
задан Claysson 10 August 2010 в 16:28
поделиться

2 ответа

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

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>
2
ответ дан 2 September 2019 в 22:17
поделиться

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

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

POST / url HTTP / 1.1 Сервер: имя-сервера / fqdn Content-Length: 100 Ожидайте: 100-continue

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

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

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

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

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

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

0
ответ дан 2 September 2019 в 22:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: