在ASP.NET中读取分块传输编码的HTTP请求主体

5

一个J2ME客户端正在使用分块传输编码发送HTTP POST请求。

当ASP.NET(在IIS6和WebDev.exe.server中)尝试读取请求时,它将Content-Length设置为0。我想这是可以的,因为当请求加载时,Content-length是未知的。

然而,当我读取Request.InputStream到末尾时,它返回0。

以下是我用于读取输入流的代码。

using (var reader = new StreamReader(httpRequestBodyStream, BodyTextEncoding)) {
    string readString = reader.ReadToEnd();
    Console.WriteLine("CharSize:" + readString.Length);
    return BodyTextEncoding.GetBytes(readString);
}

我可以使用 Fiddler 模拟客户端的行为,例如:

URL http://localhost:15148/page.aspx

请求头: User-Agent: Fiddler Transfer-Encoding: Chunked Host: somesite.com:15148

请求体: 兔子 兔子 兔子 兔子。感谢您的到来,这非常有用!

从上面读取我的请求体将返回一个零长度的字节数组...很糟糕...

是否有人知道如何在IIS和ASP.NET开发服务器(Cassini)上启用分块编码?

我为IIS找到了this script,但它不起作用。

2个回答

2

看起来很正式:Cassini不支持Transfer-Encoding: chunked请求。

默认情况下,客户端通过使用分块的HTTP传输编码发送大型二进制流。 由于ASP.NET开发服务器不支持这种编码,因此您不能使用此Web服务器托管必须接受大型二进制流的流数据服务。


1

那个网址已经失效了,所以直接测试很困难。我想知道这是否有效,谷歌搜索结果显示bytes.com上有人有相关经验。如果您再次将您的网站上线,我可以在那里测试一下这个方法是否真的有效。

Joerg Jooss写道:(为了简洁略作修改)

string responseText = null;
WebRequest rabbits= WebRequest.Create(uri);
using (Stream resp = rabbits.GetResponse().GetResponseStream()) {
    MemoryStream memoryStream = new MemoryStream(0x10000);
    byte[] buffer = new byte[0x1000];
    int bytes;
    while ((bytes = resp.Read(buffer, 0, buffer.Length)) > 0) {
        memoryStream.Write(buffer, 0, bytes);
    }
    // use the encoding to match the data source.
    Encoding enc = Encoding.UTF8;
    reponseText = enc.GetString(memoryStream.ToArray());
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接