我正在尝试通过POST请求将xml数据发送到Web服务器。我需要以块的形式发送请求以跟踪进度。
我已经意识到,当我设置:
webRequest.SendChunked = true
调用GetRequestStream()
时,会向服务器发送一个空请求正文。但是,当调用SendChunked
false
并调用GetRequestStream()
时,在写完流并关闭它或调用GetResponse
之前,不会向服务器发送任何请求。< / p>
以下是我的代码的一部分:
HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(url);
webRequest.Method = "POST";
webRequest.ContentType = "application/xml";
webRequest.Accept = "application/xml";
webRequest.AllowWriteStreamBuffering = false;
webRequest.SendChunked = true;
// get the bytes.
byte[] xmlBytes = Encoding.UTF8.GetBytes(this.reqStrTpl);
// webRequest.ContentLength = xmlBytes.Length;
Stream requestStream = webRequest.GetRequestStream();
从SendChunked
设置为true
的代码中,在此次调用时将空请求正文发送到服务器:
Stream requestStream = webRequest.GetRequestStream();
甚至在我写入流之前。但是,如果SendChunked = false
和我设置了ContentLength,则在我写入流并调用GetResponse
之前,不会发送任何请求正文。
我想知道在发送块的时候我做错了什么导致在调用GetRequestStream()时发送一个空主体,而我甚至没有写入流。提前谢谢。
答案 0 :(得分:0)
好的,我找到了解决方案。只是为了帮助那些可能遇到类似问题的人:
问题是我使用PHP作为CGI / FastCGI,它无法正确处理分块传输。这是一个错误报告:https://bugs.php.net/bug.php?id=60826。我还不知道是否有修复方法。
解决方案是使用PHP作为apache处理程序。我这样做了,现在当调用WebRequest.GetRequestStream()
时,我有机会以块的形式写出身体,它完美无缺。我捕获了网络数据包,当我在流中写入时,我可以确认请求正文是以块的形式发送的。
另一个需要注意的重要事项是Transfer-Encoding: chunked
规范指示数据必须以十六进制值后跟\r\n
的数据长度开头。例如:
D\r\nDaniel Oppong\r\n0\r\n\r\n
其中D是数据长度的十六进制值,即13。
当写入数据字节时,不要自己写这些,因为它将由请求对象自动完成。我最初自己编写它们并意识到它们也是用服务器上收到的数据编写的。然后我想到只写数据并通过观察网络数据包,这些字符在发送之前已经作为数据的一部分写入。服务器上收到的数据已按预期完成。
我希望这会有助于其他有类似问题的人。