C# request.GetResponse始终提供超时

C# request.GetResponse始终提供超时,c#,.net,httpwebrequest,timeout,C#,.net,Httpwebrequest,Timeout,我为一个程序创建了一个函数,当请求类型为GET时,该函数可以工作,如果它是POST,它总是在HttpWebResponse=(HttpWebResponse)Request.GetResponse()行上产生超时异常(并且没有达到50秒的超时) 我尝试了很多东西,但我不知道为什么,也许这里有人知道。 编辑:如果有人感兴趣,就让它工作起来: 任何帮助都将不胜感激。 我的代码是: public ResRequest request(string URL, RequestType typ, Co

我为一个程序创建了一个函数,当请求类型为
GET
时,该函数可以工作,如果它是
POST
,它总是在
HttpWebResponse=(HttpWebResponse)Request.GetResponse()行上产生超时异常(并且没有达到50秒的超时)

我尝试了很多东西,但我不知道为什么,也许这里有人知道。

编辑:如果有人感兴趣,就让它工作起来:

任何帮助都将不胜感激。

我的代码是:

public ResRequest request(string URL, RequestType typ, CookieCollection cookies, string postdata ="", int timeout= 50000)
    {
        byte[] data;
        Stream req;
        Stream resp;

        HttpWebRequest request = WebRequest.Create(URL) as HttpWebRequest;
        request.Timeout = timeout;
        request.ContinueTimeout = timeout;
        request.ReadWriteTimeout = timeout;
        request.Proxy = new WebProxy("127.0.0.1", 8118);
        request.Headers.Add(HttpRequestHeader.AcceptLanguage, "de");
        request.Headers.Add("UA-CPU", "x86");


        request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate");
        request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.21022; .NET CLR 3.5.30729; .NET CLR 3.0.30618) ";
        request.CookieContainer = new CookieContainer();
        request.CookieContainer.Add(cookies);
        if (typ == RequestType.POST)
        {
            data = System.Text.Encoding.Default.GetBytes(postdata);
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = data.Length;
            req = request.GetRequestStream();//after a few tries this produced a Timeout error
            req.Write(data, 0, data.Length);
            req.Close();
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();//This line produces a Timeout Exception
            resp = response.GetResponseStream();

            if ((response.ContentEncoding.ToLower().Contains("gzip"))) 
            {
                resp = new System.IO.Compression.GZipStream(resp, System.IO.Compression.CompressionMode.Decompress);
            } else if ((response.ContentEncoding.ToLower().Contains("deflate"))) {
                resp = new System.IO.Compression.DeflateStream(resp, System.IO.Compression.CompressionMode.Decompress);
            }

            return new ResRequest() { result = new System.IO.StreamReader(resp, System.Text.Encoding.UTF8).ReadToEnd(), cookies = response.Cookies, cstring = cookiestring(response.Cookies) };

        }
        else
        {
            request.Method = "GET";

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            resp = response.GetResponseStream();

            if ((response.ContentEncoding.ToLower().Contains("gzip")))
            {
                resp = new System.IO.Compression.GZipStream(resp, System.IO.Compression.CompressionMode.Decompress);
            }
            else if ((response.ContentEncoding.ToLower().Contains("deflate")))
            {
                resp = new System.IO.Compression.DeflateStream(resp, System.IO.Compression.CompressionMode.Decompress);
            }

            return new ResRequest() { result = new System.IO.StreamReader(resp, System.Text.Encoding.UTF8).ReadToEnd(), cookies = response.Cookies, cstring = cookiestring(response.Cookies) };
        }

    }

那么它是每次挂起
req.GetRequestStream()
,还是“几次尝试”后挂起

如果它工作了几次,然后挂起,则可能是您没有正确关闭请求,这导致连接耗尽。确保
Close()
和/或
Dispose()
HttpWebResponse
对象以及您正在创建的所有流和读卡器。

您必须使用 response.Dispose()


方法的结尾

好的,它不小。。。我删除了它,你为'timeout'设置了什么?我没有设置可选参数,因此它的50000/50s可能是一个多部分的帖子。不确定问题是什么,但尝试这个家伙的方法来写帖子数据,看看是否有效。每次我执行
req.GetRequestStream()
时,它都会挂起。谢谢,但没用。我还发现,当我不向请求传递任何Post参数时,它将连接并返回一个500服务器错误。什么是
data.Length
?你想发送一些非常大的东西吗?在我根据几个示例代码重写函数之后,第三个请求之后的每个请求都失败了。多亏了你的提示,我添加了
Close()
Dispose()
HttpWebRespose
s,现在一切都很好。代码: