9

httpwebrequest を使用して、リモート サーバー上で残りのようなサービスを使用しようとしていましたが、最初の実行自体から、コードがプログラムをハングさせていました。次に、プログラム自体とは何の関係もないことを確認するためにコンソール アプリケーションとして試してみましたが、うまくいきませんでした。

        string credentialsJson = @"{""username"":""test"",
                                      ""password"":""test"" 
                                   }";

        int tmp = ServicePointManager.DefaultConnectionLimit;
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(@"https://qrua.com/qr/service" + @"/auth/login");
        request.Method = "POST";
        request.KeepAlive = true;
        request.Timeout = 50000 ;
        request.CookieContainer = new CookieContainer();
        request.ContentType = "application/json";
        try
        {
            StreamWriter writer = new StreamWriter(request.GetRequestStream());
            writer.Write(credentialsJson);
        }
        catch (Exception e)
        {
            Console.WriteLine("EXCEPTION:" + e.Message);
        }

        //WebResponse response = request.GetResponse();
        try
        {
            using (WebResponse response = (HttpWebResponse)request.GetResponse())
            {
                Console.WriteLine("request:\n" + request.ToString() + "\nresponse:\n" + response.ContentLength);
                response.Close();
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("EXCEPTION: in sending http request:" + " \nError message:" + e.Message);
        }

さまざまなフォーラムからいくつかのことを試しましたが、役に立ちません。上記のコードを使用した単純なコンソール アプリでも、コンソールが無期限にハングします。どんな助けでも素晴らしいでしょう..

ありがとう

4

3 に答える 3

14

あなたは決して閉じていませんStreamWriter...だから私はそれがフラッシュされていないのではないかと思います。確かに、ハングアップするだけでなく、サーバーからのエラーが予想されますが、一見の価値があります。

ところで、応答を閉じて破棄する必要はありません。usingステートメントだけで十分です。

于 2010-07-09T15:00:10.437 に答える
4

Timeoutリモートサーバーが応答しない場合は、リモートサイトが応答しなかったために操作を完了できないことをユーザーに通知するために、定義して例外をキャッチする以外にできることはほとんどありません。

var request = (HttpWebRequest)WebRequest.Create("https://qrua.com/qr/service/auth/login");
request.Timeout = 5000;
// If the server doesn't respond within 5 seconds you might catch the timeout exception
using (var response = request.GetResponse())
{

}

UIをフリーズしたくない場合は、非同期バージョンを使用できます:BeginGetResponse

于 2010-07-09T15:02:33.337 に答える
0

request.ContentLength を指定してみてください。

実行する前に:

        StreamWriter writer = new StreamWriter(request.GetRequestStream());
        writer.Write(credentialsJson);

次のようなことを試してください:

using (MemoryStream stream = new MemoryStream())
{
    using (var writer = StreamWriter writer = new StreamWriter(stream))
    {
        writer.Write(credentialsJson);
        writer.Close();
    }
    request.ContentLength = stream.Length;
}
于 2011-07-19T10:27:01.947 に答える