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

如果远程服务器没有响应,除了定义 aTimeout并捕获异常以通知用户操作无法完成,因为远程站点没有响应之外,您无能为力:

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 回答