我们正在建立在C#中为我们的应用程序,它存在于使用IIS7来承载我们的应用程序HTTP之上的综合集成测试框架。

由于我们的集成测试的一部分,我们要测试的传入请求,这将导致在EndOfStreamExceptions(“无法读取超出流的末尾”)发生时,客户端发送了指示较大的车身尺寸比实际发送的HTTP报头作为身体的一部分。我们要测试我们的错误恢复代码这个条件,所以我们需要模拟这些类型的请求。

我要寻找一个基于FX-.NET套接字库或自定义HttpWebRequest的替代品,特别是使开发人员能够模拟这样的条件下加入到我们的集成测试套件。有谁知道任何这样的库?可编写脚本的解决方案将正常工作。

有帮助吗?

解决方案

调用GetRequestStream(或BeginGetRequestStream)之前设置的ContentLength属性,然后写更少的字节到流中。如果您尝试设置它,你已经得到了请求流后的ContentLength将抛出。如果不设置的ContentLength,HttpWebRequest的将缓冲头,直到流被关闭,以便它可以适当地设置的ContentLength(或者,你可以使用SendChunked但不会为你在这里工作)。如果你想在这个最大程度的控制,手动创建malormed请求或2个,然后打开一个socket端口80的服务器上,并写请求到TCP流,然后读取响应并检查连接,看它是否被关闭

但是:我不认为这个测试是一个好主意。这里的问题:

客户端向服务器发送请求。它声称的内容将是100个字节。然后它发送90个字节,然后就停止发送,留下连接打开。服务器读取90个字节,则因为客户说,100个字节将被送往等待休息。现在,客户端发送的第二请求。什么将在服务器与所述第一10个字节的新请求的办?

答案是服务器将假定这些字节是先前请求的一部分,并把它们作为这样,然后开始读取“新”请求10个其开始之后的字节,这显然会导致畸形头。服务器将不喜欢这样,所以它会发送一个4xx错误,然后它会关闭连接。关闭连接的原因是因为它现在已经没有办法知道正在发送的数据,将其手段和没有办法恢复。此外,连接的关闭不会优美,这将是突然和HttpWebRequest的上提交的是第二请求的另一端(或第三或第四,如果他们排队)将抛出引发WebException说,基础连接已经关闭,让你猜,为什么。

此相同的行为是什么原因导致的连接与封闭的预计100继续报头和所述服务器返回一个100继续随后是4XX这样当需要验证为。尽管它拒绝了这一要求,但它仍然必须假定下一字节是相同的请求的一部分,因为它一直致力于通过发送100继续接收这些字节。如果无法将其服务该请求,或者如果客户想取消该请求,并提交一个新的(推测可能与身份验证凭据),那么它必须关闭连接,并打开一个新的。

最后,测试从使用TCP没有任何意义,我在所有的网络数据流的EndOfStreamException。 TCP没有标注流的“结束”,它,因为它被写入到插座只是不断发送数据。没有“EOF”它并没有办法来检测,如果是所有传输的数据,除非你知道多少数据的期望。 TCP并没有真正有一个“结束”其流,除非连接被关闭,在这种情况下,你不同的地方在堆栈你工作得到引发WebException或SocketException。在协议的任何发送错误将在Winsock的处理。如果没有更多的数据发送,连接的一端将最终发送保活到其他以确保该连接仍然是实际打开和一个主机不只是删除它。如果保活超时,则连接将被关闭,你可以尝试从中读取下一次得到引发WebException。鉴于这一切是如何的作品,我只是不明白你怎么会得到任何价值进行这项试验的。你好得多仅仅发送畸形的请求,并确保错误得到相应的处理,并发送相应的4xx消息返回到客户端和连接被正常关闭。

其他提示

我不知道任何这样的库,但在我看来,这将是对接收方非常简单,如果这是你在哪里编码。

只要检索整个WebRequest的,只要你想截断尽可能多或尽可能少,然后转发给他人。您可能需要做的WebRequest的新副本的过程中,而不是就地截断,但它仍然应该直截了当。

你就不能在客户端上HttpWebRequest.ContentLength属性设置为比数据的实际尺寸更小或更大的价值?

如果您想模拟任何像这样的事情,你在哪里违反了HTTP协议,那么你将不得不编写自己的代码来做到这一点。 HttpWebRequest的不允许你做这样的事情。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top