WebException:底层连接已关闭

Posted

技术标签:

【中文标题】WebException:底层连接已关闭【英文标题】:WebException: The underlying connection was closed 【发布时间】:2011-08-04 15:11:48 【问题描述】:

我目前正在从 ASP.net 页面调用 Web 服务。我正在尝试调用基于 REST 的 Web 服务来请求某个操作并返回 404(这代表我的应用程序的特定错误)。我尝试捕捉错误,但当返回 404 时,我的应用程序反而继续挂起,我最终捕捉到以下错误。

[System.Net.WebException] = “底层连接已关闭:接收时发生意外错误。”

为什么在 Web 服务响应 404 后 2 秒内我会捕获到不同的错误?

try

    newPassword = Customer.ResetPassword(_transaction.Centre.Id, newPassword);

catch(WebException ex)

    HttpWebResponse response = (HttpWebResponse)ex.Response;

    if ((response != null) && (response.StatusCode == HttpStatusCode.NotFound))
    
        //then the email address doesnt exist
        ErrorPage(104);
    
    else
    
         ErrorPage();
    
 
 catch (Exception ex)
 
    ErrorPage();
 

这就是所谓的:

Request currentRequest = new Request(uri,
            Communication.Request.HttpRequestType.POST,[hidden][hidden]);

Response response = currentRequest.Send(Serializer.Serialize<ResetPassword (resetPassword));

return Serializer.Deserialize<ResetPassword>(response.BodyData);

请忽略[隐藏]标签。我不得不从公众视野中隐藏它。不过,我希望这会有所帮助。

感谢大家的帮助!

【问题讨论】:

请出示代码。与 .NET 相比,问题更可能出在您的代码中。 那么让我直说吧。 Customer.ResetPassword 调用第二个代码块。它调用 URI 来执行密码重置。所有这些客户端代码或 Web 服务是否有问题?什么初始化了这段代码?入口点在哪里? 没错。入口点附加到 Click 事件。因此,在“重置密码”按钮上单击它会调用第二个代码块。有问题的是客户端代码。即使 Web 服务响应它,它似乎也没有收到 404。 【参考方案1】:

由于您提供的系统信息很少:

可能提前终止了您的网络服务调用,例如

HttpContext.Current.Response.End()

Web 服务代码(在 .NET 中)可能正在尝试完成请求,但您提前关闭了连接。 Response.Redirect() 也会发生这种情况,但您永远不会在 Web 端看到它,因为您已经完成了向用户的输出。它与您的 404 无关。Web 服务代码抛出 WebException 但没有任何东西可以处理/格式化输出。


更新

根据您的反馈,我只能推断您的问题可能是:

    在发送到网络服务的数据中 Web 服务如何处理数据

您应该下载Fiddler2 并嗅探到您的网络服务的http 请求,以验证实际通过网络传输的内容。如果一切顺利,那么我只能想到两件事:

    您的Request/Response 有问题。您可以改用WebClient 并调用UploadData(...)UploadString(...) 将您的数据传输到网络服务。 Web 服务出现问题,导致它在按照客户期望的方式终止响应之前关闭连接。

WebException:底层连接已关闭:接收时发生意外错误。仅当客户端希望接收数据(如标头后的正文)但服务器终止响应时才会发生早点。

【讨论】:

如果有帮助,请提供更多细节。我要求忘记密码并发布电子邮件地址以更改密码。如果我们的数据库中不存在电子邮件,它会返回 404。我的客户端 ASP.net 应用程序应该捕获 404,但在 404 返回到客户端大约 2 秒后捕获超时。希望对您有所帮助,顺便说一句,感谢您当前的回复! @Base33:同样,你还没有给我足够的支持。我的回答基本上解释了该异常通常来自哪里。没有代码示例,我无法真正缩小范围。 还需要更多细节。你在这个函数里面调试过吗?如果是这样,您能否缩小导致滞留的线路范围?你在使用 WCF 吗?还是普通的旧网络服务?你要返回什么类型的? 你返回,或使用像Resonse.End()这样的转义方法。您如何将电子邮件返回给客户?请使用更多信息编辑您的问题,最好从有问题的代码中截取它,以便我们提供帮助。 不,不使用 Response.End()。我已经调试过了,它似乎挂在 currentRequest.Send 中。它应该收到响应并导致客户端捕获 404。 谢谢!这几乎就是我们所需要的。

以上是关于WebException:底层连接已关闭的主要内容,如果未能解决你的问题,请参考以下文章

调用 SOAP 时,“底层连接已关闭:预期保持活动状态的连接已被服务器关闭”

如何在向某些站点发出 HttpWebRequest 时修复“底层连接已关闭:连接已意外关闭”

RestSharp:底层连接已关闭:服务器关闭了预期保持活动状态的连接

Authorize.net : 底层连接已关闭

底层连接已关闭:接收时发生意外错误

System.ServiceModel.CommunicationException:底层连接已关闭