第一次请求后,应用程序挂起在GetRequestStream()上

时间:2014-03-11 22:01:07

标签: c# network-programming httpwebrequest httpwebresponse

我在谷歌上搜索并搜索过。有些人认为流不是很接近,有些人认为这是一个连接限制,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;
        }

1 个答案:

答案 0 :(得分:1)

您没有处理第一次请求的回复。

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

我们遇到了类似的问题并正确处理了回应,帮助了我们。