使用jQuery.ajax()时,HttpListener只获取前900字节的InputStream

时间:2010-08-09 18:49:51

标签: c# jquery http stream httplistener

我有一个非常简单的类,使用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时会遇到同样的问题。

1 个答案:

答案 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;