【问题标题】:Simulating connection problems for .NET HttpWebRequest模拟 .NET HttpWebRequest 的连接问题
【发布时间】:2010-09-21 15:30:24
【问题描述】:

在使用 HttpWebRequest 类时,有没有办法以编程方式模拟连接问题(连接缓慢、响应未完成、连接断开等)?

谢谢

编辑:为了详细说明,我需要这个来进行调试,但最终想把它变成一个测试。我正在使用异步方法 BeginGetRequestStream、EndGetRequestStream、BeginGetResponse 和 EndGetResponse。我已经将它们全部包装在适当的(我希望)Try Catch 块中,记录发生的异常。

我知道这适用于某些情况(例如,当我拔出网络电缆时)。但是在极少数情况下(即仅当我请求的网站速度很慢时)我的系统崩溃了,我在事件日志中得到了这个

Exception: System.Net.WebException

Message: The request was aborted: The connection was closed unexpectedly.

StackTrace:    at System.Net.ConnectStream.BeginRead(Byte[] buffer, Int32 offset, Int32 size, AsyncCallback callback, Object state)
   at System.IO.Compression.DeflateStream.ReadCallback(IAsyncResult baseStreamResult)
   at System.Net.LazyAsyncResult.Complete(IntPtr userToken)
   at System.Net.ContextAwareResult.CompleteCallback(Object state)
   at System.Threading.ExecutionContext.runTryCode(Object userData)
   at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Net.ContextAwareResult.Complete(IntPtr userToken)
   at System.Net.LazyAsyncResult.ProtectedInvokeCallback(Object result, IntPtr userToken)
   at System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
   at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)

我假设它来自 HttpWebRequest,但我的所有代码又被包装在 Try Catch 块中。

模拟在这种情况下会有所帮助吗?

【问题讨论】:

  • 不,模拟在这种情况下无济于事,因为您不知道是什么导致您的请求中止。我猜你的客户端应用程序和你连接的服务器之间有一个代理,它关闭了连接。或者服务器本身将其关闭为未使用。需要更多信息。
  • 我无法提供更多信息。有趣的是,它似乎只在第 3 方的网站运行缓慢时才会发生。最重要的是,事件日志消息在堆栈跟踪中甚至没有我自己的代码方法。到目前为止,已经有很多猜测工作和拉电缆的恶作剧 =/

标签: .net testing httpwebrequest connection


【解决方案1】:

@克里斯 不幸的是,微软忽略了make many of the BCL objects easily mockable,因为他们倾向于使用抽象类,而 .NET 类在设计上是封闭的(换句话说,对于要被子类覆盖的方法,它需要显式标记为虚拟),而 Java 是按设计开放的(也就是说,子类可以覆盖任何方法,除非它们被标记为 final)。使用接口或将方法标记为虚拟会在测试空间中省去很多麻烦。微软现在可能有可测试性信仰(例如 ASP.NET MVC),但对于 BCL 来说有点晚了。

Typemock Isolator may be able to help,但在这种情况下,我不相信 Moq 可以。

【讨论】:

  • +1 David,再举一个例子,像 WinForms 这样的 MS 库的不可扩展性绝对令人沮丧。
【解决方案2】:

如果这是出于测试目的 - 即检查您的代码行为,我建议创建一个继承自 HttpWebRequest/HttpWebResponse 的类,并覆盖您感兴趣的方法以按照您想要的方式运行 - 即线程。延迟睡眠、抛出异常等。

【讨论】:

【解决方案3】:

如果您可以控制响应请求的站点,我会说让线程休眠一段时间会模拟缓慢的响应。 System.Threading.Thread.Sleep(毫秒数)

至于连接断开,我想不出任何程序化的东西,但我确实拔掉了我的网络电缆来模拟这种情况。

【讨论】:

    【解决方案4】:

    假设您正在编写单元测试来覆盖代码,您可以使用模拟框架(我个人更喜欢Moq)来模拟类上任何虚拟方法的 HttpWebRequest 的实现。在您的模拟中,您可以自己实现您希望测试用例的行为方式。

    【讨论】:

      猜你喜欢
      • 2012-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多