请求.GetResponse总是超时

12

我为一个程序编写了一个函数,当请求类型是 GET 时能正常工作,但如果是 POST,则总是在行 HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 抛出超时异常(尽管超时时间为50秒)。
我尝试了很多方法,但还是没有找到原因,也许这里有人知道。



编辑:我已经解决了,如果有人感兴趣: https://gist.github.com/4347248

非常感谢任何帮助。

我的代码如下:

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

    }

好的,这不是小事……我已经把它移除了。 - Tearsdontfalls
你设置了什么“超时”? - VladL
我没有设置可选参数,所以它是50000/50秒。 - Tearsdontfalls
1
可能,这个帖子是一个多部分的帖子。 - urlreader
不确定问题出在哪里,但是可以尝试这位专家的方法来编写帖子数据,看看是否有效。http://social.msdn.microsoft.com/Forums/is/windowsmobiledev/thread/9ed17340-e0f7-4933-b06e-b4ccefca1391 - Evan
@urlreader 不是的,我刚用 LiveHttpheaders 检查了一下,它是 application/x-www-form-urlencoded - Tearsdontfalls
2个回答

16

每次都挂在 req.GetRequestStream() 上还是只有在几次尝试后才会挂起?

如果它在几次尝试后工作一段时间后挂起,那么很可能是您没有正确关闭请求,这会导致连接耗尽。请确保对创建的所有HttpWebResponse对象以及所有流和阅读器进行Close()和/或Dispose()操作。


每次我执行 req.GetRequestStream() 时它都会挂起。谢谢,但是它没有起作用。我还发现,当我不向请求传递任何Post参数时,它将连接并返回500个服务器错误。 - Tearsdontfalls
data.Length是什么意思?你是不是要发送一个非常大的东西? - Brian Reischl
1
在我根据几个示例代码重写函数后,第三个请求之后的每个请求都失败了。感谢您的提示,我在HttpWebResposeStream中添加了Close();Dispose();,现在一切都很好。 代码:https://gist.github.com/4347248 - Tearsdontfalls

1

你需要使用response.Dispose();

在方法结束时执行


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