【问题标题】:Application hangs on GetRequestStream() after first request第一次请求后,应用程序在 GetRequestStream() 上挂起
【发布时间】:2014-04-15 18:21:42
【问题描述】:

我在这里用谷歌搜索过。有些人认为流没有关闭,其他人则认为这是连接限制,ServicePointManager.DefaultConnectionLimit 设置为 1。但是,这些似乎都不起作用。

我的问题是,当我第一次使用它时,它可以工作:

using (var stream = request.GetRequestStream())
{
     var data = Encoding.UTF8.GetBytes(post.ToString());
     stream.Write(data, 0, data.Length);
}

当我第二次使用它时,它会冻结。是的,我正在处理我的流,是的,我正在中止并关闭我的响应和请求。

这是我的整个代码段:

public string get_hash(string strUsername, string strPassword, string strUniverse)
        {
            // Request VAR
            var request = (HttpWebRequest)WebRequest.Create("http://website.com/");
            // Response VAR
            var response = (HttpWebResponse)request.GetResponse();
            // Cookie Var
            var cookie = new CookieContainer();

            ServicePointManager.DefaultConnectionLimit = 100;            
            request.Timeout = 10;

            request = (HttpWebRequest)WebRequest.Create("http://website.com/main/login");

            request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
            request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
            request.Headers.Add("Accept-Encoding", "gzip,deflate,sdch");
            request.Headers.Add("Accept-Language", "en-US,en,q=0.8");
            request.Headers.Add("Cache-Control", "max-age=0");
            request.ContentType = "application/x-www-form-urlencoded";
            request.Host = "website.com";
            request.Headers.Add("Origin", "http://website.com");
            request.Referer = "http://website.com/";
            request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36";
            request.Method = "POST";

            request.CookieContainer = new CookieContainer();
            request.CookieContainer.Add(cookie.GetCookies(request.RequestUri));

            // SET POST DATA HERE
            var post = HttpUtility.ParseQueryString(string.Empty);
            post.Add("uni", strUni);
            post.Add("login", strUsername);
            post.Add("pass", strPassword);

            using (var stream = request.GetRequestStream())
            {
                var data = Encoding.UTF8.GetBytes(post.ToString());
                stream.Write(data, 0, data.Length);
                stream.Close();
                stream.Dispose();
            }

            response = (HttpWebResponse)request.GetResponse();

            string strSSID = "Failed";

            if (response.StatusCode == HttpStatusCode.OK)
            {
                var data = string.Empty;
                using (var sReader = new StreamReader(response.GetResponseStream()))
                {
                    data = sReader.ReadToEnd();
                    sReader.Close();
                    sReader.Dispose();
                }

                string strSSIDurl = response.ResponseUri.ToString();

                int intSSIDurlStart = strSSIDurl.IndexOf("PHPSESSID=") + 10;
                strSSID = strSSIDurl.Substring(intSSIDurlStart);
            }

            request.Abort();
            response.Close();
            response.Dispose();

            return strSSID;
        }

【问题讨论】:

  • 我真的建议使用 Fiddler 或其他一些网络调试工具来查看GetRequestStream() 发生的真正情况。如果不查看实际发送/接收的内容,很难判断可能是什么问题。
  • 发送或接收什么重要吗?它应该是 .close 和 .disposed 但它似乎只是挂起,直到大约一分钟后它最终超时。
  • 好吧,看看端点上的某些东西是否正在挂起或挂起您的应用程序不会有什么坏处。当您调试并跳过有问题的行时,它会在进入下一行之前挂起吗?此外,您不需要在using 块中调用Dispose() 和Close() inside,这就是using 块在超出范围时所做的事情。
  • 我知道这一点,并希望毫无疑问地表明连接被告知关闭并被处理。它在遇到 .GetRequestStream() 上的 using 块时开始挂起。我不认为这是端点的问题。
  • 很明显它在端点超时,您的代码本身可以正常工作并且一切都被正确关闭/处理,但是无论出于何种原因,请求都需要很长时间才能获得响应流。不知道除了在 Fiddler 或其他一些 Web 调试器中观看实际请求之外我还能说什么。如果你还没有这个工具,我真的建议你得到它,它是免费的,真的有助于了解发生了什么。抱歉,我无法提供更多帮助。

标签: c# network-programming httpwebrequest httpwebresponse


【解决方案1】:

您没有处理第一个请求的响应。

var request = (HttpWebRequest)WebRequest.Create("http://website.com/");
var response = (HttpWebResponse)request.GetResponse(); // Not disposed

我们遇到了类似的问题,正确处理响应对我们很有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    相关资源
    最近更新 更多