HttpListener只得到使用jQuery.ajax当第一900个字节InputStream的()
-
27-09-2019 - |
题
我使用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());
}
}
}
我也使用下面的Javascript在Firefox(使用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
}
});
}
时遇到的问题是,为InputStream永远只包含大约900个字节从Firefox时发送。如果我把小提琴手Firefox和我的应用程序之间,它正确发送所有9900个字节。而是直接从Firefox发送到我的应用程序时,只有第一个900个字符(编码为UTF8,所以900字节)被发送。
如果我使用curl数据发布到我的应用程序,它完美的作品。菲德勒还能够将数据上传到我的应用程序,并把它正确读取。提琴手是能够读取从Firefox发布给它的数据,但我的应用程序不能。
使用不同尺寸的HTML,不同量发送,但它始终对同一页面大小相同。无论规模大小,它总是发送899个999字节之间。如果一个页面是下900个字节,它的工作原理和正确地从InputStream读取的所有数据。
一种理论我是,它可能会被发送1024个字节,但HTTP标头被消耗一些字节,但是HTTP头比〜120个字节大得多。
一件事我应该提到的是,这个JS是从一个Firefox扩展,采用进口的jQuery中运行。我不认为这是造成问题的原因虽然,因为我从页面内运行同一个JavaScript时遇到了这个同样的问题。的
解决方案
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;
不隶属于 StackOverflow