我使用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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top