1

私は.netでWebRequestクラスを使用しており、レスポンスで応答しているサーバーにPOSTデータを送信しています。

奇妙なことに、ネットワーク トラフィックを分析するために fiddler を開始したときには機能していましたが、fiddler がないと機能しません。

そこで、WireShark を使用して、コンピューターとの間で送受信されるパッケージの分析を開始しました。このプログラムでは、TCP ストリームを簡単に追跡できます。したがって、フィドラーをオンにすると、正しい要求ヘッダー/本文が送信され、応答ヘッダー/本文が取得されることがわかります。奇妙な部分は、フィドラーを使用しない場合に要求ヘッダーが送信され、次に応答ヘッダー/本文が取得され、最後に 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();
4

2 に答える 2

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>
于 2010-08-10T16:53:16.710 に答える
0

クライアントがサーバーからの「HTTP/1.1 100 continue」応答を待っている疑いがあります。これが仕組みです。サーバーにデータを送信するとき、サーバーがまだデータを受け入れる準備ができていない場合があります。たとえば、最初にクライアントを認証する必要があります。

したがって、POST リクエストを送信すると、クライアントは「Expect: 100-continue」を追加してリクエスト ヘッダーを送信するだけです。

POST /url HTTP/1.1 Server: Server-name/fqdn Content-Length: 100 Expect: 100-continue

サーバーがデータを受信する準備ができている場合、次のように応答します。

HTTP/1.1 100 続行 サーバー: サーバー名/fqdn

これで、クライアントはデータを送信できます。

ただし、サーバーがデータを受信する準備ができておらず、クライアントを認証したい場合は、別のステータス コードで応答します。

Wireshark トレースを pastebin.com に投稿すれば確認できますが、これが起こっているのではないかと思います。

フィドラーでこれが表示されない理由は、フィドラーが HttpListener を使用して HTTP 要求をリッスンし、HTTP リスナーが 100-continue などの中間応答をアプリ (この場合はフィドラー) から隠している可能性があります。

于 2010-08-10T20:15:39.077 に答える