C# 带有计时器的异步HttpWebRequest问题

C# 带有计时器的异步HttpWebRequest问题,c#,.net,timer,C#,.net,Timer,情况:我正在使用msdn中记录的HttpWebRequest.BeginGetResponse。我有一个计时器每10秒发送一次请求。测试时,我收到了xml结构化信息 结果是:在客户处运行该工具时,我收到了不完整(因此不可解析)的XML(每个大约4KB)。我可以签入浏览器并完全查看它(显然是通过浏览器的同步请求?!)。我使用有关内容长度的标题信息来调整接收缓冲区的大小 是什么引起的?我不知道。数据相当小。尽管如此,我还是使用了中描述的ThreadPool.RegisterWaitForSingle

情况:我正在使用msdn中记录的HttpWebRequest.BeginGetResponse。我有一个计时器每10秒发送一次请求。测试时,我收到了xml结构化信息

结果是:在客户处运行该工具时,我收到了不完整(因此不可解析)的XML(每个大约4KB)。我可以签入浏览器并完全查看它(显然是通过浏览器的同步请求?!)。我使用有关内容长度的标题信息来调整接收缓冲区的大小

是什么引起的?我不知道。数据相当小。尽管如此,我还是使用了中描述的
ThreadPool.RegisterWaitForSingleObject
方法来定义超时,我还为超时选择了10秒。也许这不是一个明智的决定,它可能应该比计时器间隔小。问题是,在这种情况下,我无法再次测试它。这是在一个生产现场,在那里我没有洞察到网络设置。雷格斯特一家在同一时间从家里跑得很好


我在这方面不是很有经验,但是当一个计时器在响应流被完全接收之前触发一个新的请求时会发生什么,例如超时时间等于计时器间隔?还有什么其他提示吗?这里的瓶颈是什么?

解决方案很简单。只有在处理完响应后才能启动计时器。

如果您连接的是另一台服务器,则来自该服务器的响应也可能被“分块”。我在某个地方读到httpwebrequest有一个bug,在分块服务器上,它不会返回完整的文件

如果是这种情况,请确保服务器没有为http流量启用“分块模式”

或者,如果这超出了您的能力范围,请使用普通套接字自己执行请求,发送http请求,然后返回完整的结果

在走这条路线之前,首先要确保这一块模式是这里的问题


R

您是如何接收数据的?您正在通过流读取数据吗?您是否使用返回的contentsize作为Stream.Read的输入参数? Stream.Read的一个不完全明显的特性是,它不能保证返回您请求的数据量。 当您调用以下函数时

public abstract int Read(byte[] buffer, int offset, int count )
它将返回实际读取的数据量。所以你可以让它读1000,然后返回400,然后还有600字节要读。 这意味着您必须继续调用Read,直到它返回0(这意味着流中没有更多数据)

我还想说,您不应该使用内容长度头信息来调整缓冲区的大小。相反,您应该创建一个动态大小的缓冲区(例如,通过使用MemoryStream对象)并从响应流读取,直到它返回0。至少,我会这样做。如果服务器更改了实现,使其不再发送响应头,那么您的解决方案将继续工作。
或者更好,因为您正在加载XML,所以创建一个XmlDocument,并要求它直接从Http响应流加载。

我想这就是我所需要的。这回答了我的意思,如果我需要照顾它。我简直不敢相信我不能在10秒内接收到4KB的数据。但是我也认为定时器对于控制某个时间间隔是无用的。也许我不应该强迫我的应用程序进入这些时间间隔,因为这取决于连接质量。分块模式也是一种选择,我将尝试了解更多。虽然它必须以某种方式连接到网络上的流量,因为正如我所说的,它同时在家里的另一台pc上工作。一旦我发现了什么,我会给出反馈。谢谢你的提示,我似乎确实误用了Stream.Read方法。