WebRequest.GetResponse被锁定了吗?

10

在编写下面的代码时,我的代码在GetResponse处锁定。为什么?

        try
        {
            WebRequest myWebRequest = WebRequest.Create(strURL);
            WebResponse myWebResponse = myWebRequest.GetResponse();
            //more code here

尝试在http://localhost上运行时没有问题,那么URI是什么? - Ralf de Kleine
没有足够的信息来诊断这个问题。无论您使用哪个URL,它是否会锁定?是只有一个URL出现问题吗?它是否一直发生?当您尝试从浏览器访问URL时会发生什么? - Pete OHanlon
1个回答

46

如果您对同一主机进行了多次请求并且没有处理WebResponse,通常会出现这种情况。

默认的连接管理设置每次仅允许同时打开2个(或者也许是4个,我记不清了)到相同主机的连接。 如果您确实需要更改此设置,请使用<connectionManagement> app.config元素 - 但通常您只需处理WebResponse即可:

try
{
    WebRequest myWebRequest = WebRequest.Create(strURL);
    using (WebResponse myWebResponse = myWebRequest.GetResponse())
    {
        //more code here

1
我喜欢Jon Skeet,他完全解决了这个问题。再次感谢,我永远不会再去检查dispose了。 - user34537
2
那对我没什么帮助。我尝试了“using”方法,以及在“using”内部对响应进行Close操作...但仍然遇到同样的问题。 - Ted
我的问题在SO上:http://stackoverflow.com/questions/8377185/c2dm-frequent-timeouts-or-errors-when-sending-webservice-does-not-respond - Ted
@John Skeet,我有一个场景,我想要将大量数据作为连续流返回。如果我放置我的返回myWebResponse.GetResponseStream(),那么在整个流被返回之前,它不会Close()流吗?...如果我不使用using语句,那么这是否也意味着myWebResponse将无法正确处理?...我知道我可以在调用函数中关闭Stream,但不确定WebResponse对象会发生什么。 - tinonetic
解决了!编写了一个void方法,该方法具有两个“Stream”参数,一个是传入的流,另一个是按照惯例用于写入的流。优雅地处理了资源释放! - tinonetic

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