c#HTTPWebRequest getResponse()私のプログラムをフリーズしてハングアップする
-
13-09-2020 - |
質問
私は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);
}
.
さまざまなフォーラムからいくつかのことを試してみましたが、それは助けをしません。上記のコードを持つ単純なコンソールアプリでさえ、コンソールを無期限にハングアップします。あらゆる助けが素晴らしいでしょう..
ありがとう
解決
StreamWriter
を閉じることはありません...だから私はそれがフラッシュされていないと思われます。確かに私はただのハングの代わりにサーバーからのエラーが期待されていますが、それは見ている価値があります。
BTW、応答を閉じる必要はありません。はそれを処分します。using
ステートメントだけで十分です。
他のヒント
リモートサイトが応答しなかったために演算が完了できないことをユーザーに完了できないことをユーザーに通知するために、リモートサーバーが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をフリーズしたくない場合は、ASYNCバージョンを使用できます。 BEGENTERSPONSE
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;
}
. 所属していません StackOverflow