我有一个非常简单的类,使用HttpListener通过AJAX请求从浏览器接收HTTP POST。我已经包含了一个突出显示此问题的演示:
private static void HandleRequest(HttpListenerContext context)
{
using (var inputStream = context.Request.InputStream)
{
for (int i = 0; i < context.Request.ContentLength64; i++)
{
Console.WriteLine("{0}:\t{1}", i, inputStream.ReadByte());
}
}
}
我还在Firefox中使用以下Javascript(使用jQuery):
upload_html: function(html){
jQuery.ajax({
type: 'POST',
data: html,
url: 'http://localhost:8080/api/html?url=' + escape(content.document.location),
success: function(data) {
// do stuff
}
});
}
我遇到的问题是,当从Firefox发送时,InputStream只包含大约900个字节。如果我将Fiddler放在Firefox和我的应用程序之间,它会正确发送所有9,900字节。但是当直接从Firefox发送到我的应用程序时,只发送前900个字符(编码为UTF8,即900字节)。
如果我使用curl将数据发布到我的应用程序,它可以很好地工作。 Fiddler还能够将数据发布到我的应用程序并正确读取。 Fiddler能够读取从Firefox发布的数据,但我的应用程序不能。
对于不同大小的html,会发送不同的金额,但对于相同的页面,它的大小始终相同。无论大小如何,它总是在899和999字节之间发送。如果页面小于900字节,则它可以正常读取InputStream中的所有数据。
我得到的一个理论是它可能会发送1024个字节,但http标头消耗了其中一些字节,但http标头远大于~120字节。
我应该提到的一件事是,这个JS是在导入jquery的Firefox扩展中运行的。我不认为这会导致问题,因为我在页面中运行相同的Javascript时会遇到同样的问题。
答案 0 :(得分:0)
ReadToEnd适合我
_RequestBody = new StreamReader(_Context.Request.InputStream).ReadToEnd();
这对二进制内容也是如此
var memoryStream = new MemoryStream();
var buffer = new byte[0xFFFF];
Stream stream = _Context.Request.InputStream;
int i = 0;
do {
i = stream.Read(buffer, 0, 0xFFFF);
memoryStream.Write(buffer, 0, i);
} while (i > 0);
memoryStream.Flush();
memoryStream.Position = 0;
return memoryStream;