c#httpwebrequest getResponse()冻结并挂起我的程序
-
13-09-2020 - |
题
我试图使用httpwebrequest在远程服务器上使用类似rest的服务,并且从第一次执行本身开始,我的代码就挂起了程序。然后我尝试了它作为一个控制台应用程序,以确保它与程序本身无关,但没有运气!
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,则可以使用异步版本: 开始回应
尝试指定请求.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