代码之家  ›  专栏  ›  技术社区  ›  Fung

.NET HttpWebRequest的连接问题模拟

  •  2
  • Fung  · 技术社区  · 17 年前

    在使用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块中。

    4 回复  |  直到 17 年前
        1
  •  3
  •   David Keaveny    17 年前

    @克里斯 make many of the BCL objects easily mockable ,因为它们倾向于使用抽象类,.NET类是按设计关闭的(换句话说,要使方法被子类重写,需要显式地将其标记为virtual),而Java是按设计打开的(即,子类可以重写任何方法,除非将其标记为final)。使用接口或将方法标记为虚拟的将在测试空间中节省许多麻烦。微软现在可能已经有了可测试性的信仰(例如ASP.NET MVC),但是对于BCL来说已经有点晚了。

    模拟隔离器 may be able to help ,但我不相信莫克可以,在这种情况下。

        2
  •  2
  •   Sunny Milenov    17 年前

    如果这是为了测试目的,即检查您的代码行为,我建议创建一个继承自HttpWebRequest/HttpWebResponse的类,并重写您感兴趣的方法,使其按您希望的方式运行,即Thread.Sleep for delays、抛出异常等。

        3
  •  0
  •   ajh1138    17 年前

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

    至于一个断开的连接,我想不出什么程序化的,但我确实拔出了我的网线来模拟这种情况。

        4
  •  0
  •   Chris Rauber    17 年前

    假设您正在编写单元测试来覆盖代码,那么您可以使用模拟框架(我个人更喜欢 Moq