7

WPF.net4.0アプリケーションを使用しています。検索バーがあります。検索トークンごとに、検索結果を取得するために8つの個別のURLに対して8つのhttpリクエストを実行する必要があります。ユーザーが検索バーへの入力を停止してから400ミリ秒後に、サーバーに8つのリクエストを送信します。6〜7個の検索トークンの結果を検索すると非常にうまくいきます。しかしその後、突然HttpWebRequestがサイレントに動作を停止します。例外はスローされず、応答は受信されませんでした。私はWindows7を使用していますが、ファイアウォールも無効にしました。後続のhttpリクエストがどこで失われるかわかりません。

誰かがこの問題を解決するために私にライトを見せてもらえますか?

以下は、HttpWebRequest呼び出しのコードです。

public static void SendReq(string url)
{
    // Create a new HttpWebRequest object.
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

    request.ContentType = "application/x-www-form-urlencoded";
    request.Proxy = new WebProxy("192.168.1.1", 8000);

    // Set the Method property to 'POST' to post data to the URI.
    request.Method = "POST";

    // start the asynchronous operation
    request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request);

}

private static void GetRequestStreamCallback(IAsyncResult asynchronousResult)
{
    HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

    // End the operation
    Stream postStream = request.EndGetRequestStream(asynchronousResult);

    string postData = this.PostData;

    // Convert the string into a byte array. 
    byte[] byteArray = Encoding.UTF8.GetBytes(postData);

    // Write to the request stream.
    postStream.Write(byteArray, 0, byteArray.Length);
    postStream.Close();

    // Start the asynchronous operation to get the response
    request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
}

private static void GetResponseCallback(IAsyncResult asynchronousResult)
{
    HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

    // End the operation
    using(HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult))
    {
        using(Stream streamResponse = response.GetResponseStream())
        {
             using(StreamReader streamRead = new StreamReader(streamResponse))
             {
                 string responseString = streamRead.ReadToEnd();
                 Debug.WriteLine(responseString);
             }
        }
    }
}
4

4 に答える 4

2

私が見ることができるのは、GetRequestStreamCallbackあなたが交換する必要があるということだけです

postStream.Write(byteArray, 0, postData.Length);

postStream.Write(byteArray, 0, byteArray.Length);

これらの長さは必ずしも等しいとは限らないためです。

于 2012-12-21T13:09:13.620 に答える
0

@Somnathあなたがこの答えを見つけたかどうかはわかりませんが、Somnathと私が抱えていたのと同じ問題で誰かがこの投稿に出くわした場合.

私たちは皆、メモリをクリーンでクリアな状態に保つために十分な注意を払うよう努めていますが、ストリームを閉じる前にストリームを確実にフラッシュすれば、原因不明の問題を常に回避できます。

これを置き換えます:

postStream.Write(byteArray, 0, byteArray.Length);
postStream.Close();

これとともに :

postStream.Write(byteArray, 0, byteArray.Length);
postStream.Flush();
postStream.Close();
于 2013-02-02T20:07:04.883 に答える
-1

皆さんから提供されたすべての提案に従いましたが、HTTP 要求のサイレント エラーを止めることができませんでした。しかし、回避策を見つけました。私自身でさえ、今まで最終的な結論に達することができませんでした。

しかし、私の回避策は今のところ問題なく機能しています。

SendReq (string url)関数で、次のコード行を追加しました

System.Net.ServicePointManager.DefaultConnectionLimit = 100; // Just selected a random number for testing greater than 2
System.Net.ServicePointManager.SetTcpKeepAlive(true, 30, 30); // 30 is based on my server i'm hitting
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

request.KeepAlive = true;
于 2013-02-14T05:49:22.990 に答える