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 时修复“底层连接已关闭:连接已意外关闭”