C#中的httpwebrequest getResponse()导致程序冻结和挂起

9

我尝试使用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);
        }

我尝试了不同论坛上的几种方法,但都没有帮助。即使是一个简单的控制台应用程序,使用上述代码也会无限期地挂起控制台!任何帮助将是非常感激的。

谢谢


尝试指定request.ContentLength。请参见:http://stackoverflow.com/questions/6736056 - Stephen Oberauer
3个回答

14
你从未关闭 StreamWriter... 我怀疑它没有被刷新。虽然我本来期望从服务器中会出现错误而非一直挂起,但这值得检查。
顺便说一句,你不需要关闭响应并且释放它。只需using语句就足够了。

你为什么在一个地方标记为正确,然后又说“尝试关闭写入器并没有什么作用”? - Stephen Oberauer
@Lost Hobbit:我建议您在问题下添加评论,而不是在我的答案下添加评论——原帖作者不会收到此评论的通知。(话说原帖作者已经11个月没有在 Stack Overflow 上出现了...) - Jon Skeet
1
使用HtmlAgilityPack库时,遵循该库中的永久重定向时,在创建新的响应之前没有关闭底层响应。 - Kenny Eliasson
这个对我来说完全奏效,正好解决了我刚遇到的问题。谢谢 @JonSkeet。 - jmrnet
帮了我很多,谢谢。 - karliwson

5

如果远程服务器没有响应,除了定义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())
{

}

如果您不想冻结用户界面,可以使用异步版本:BeginGetResponse

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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接