代码之家  ›  专栏  ›  技术社区  ›  Matt Brindley

HttpListener在使用jQuery.ajax()

  •  3
  • Matt Brindley  · 技术社区  · 14 年前

    我有一个非常简单的类,它使用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
                }
       });
    }
    

    我遇到的问题是InputStream从Firefox发送时只包含大约900个字节。如果我把Fiddler放在Firefox和我的应用程序之间,它会正确地发送所有9900字节。但是当直接从Firefox发送到我的应用程序时,只发送前900个字符(编码为UTF8,所以是900个字节)。

    如果我使用curl将数据发布到我的应用程序中,它将非常有效。Fiddler还能够将数据发布到我的应用程序中,并使其正确读取。Fiddler能够从Firefox读取发布到它的数据,但我的应用程序不能。

    我的一个理论是,它可能发送1024个字节,但是http报头消耗了其中的一些字节,但是http报头比~120个字节大得多。

    1 回复  |  直到 14 年前
        1
  •  0
  •   Darrel Miller    14 年前

    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;