如何在aspx中获取多部分请求数据?

时间:2014-12-08 08:01:13

标签: c# asp.net .net .net-3.5 multipart

我正在尝试从Android向C#(。net 3.5)aspx服务器发送HttpPost请求。我在Android端使用Apache多部分实体构建器构建实体:

entityBuilder.addTextBody("username", username);
entityBuilder.addTextBody("password", password);
entityBuilder.addBinaryBody("file", file);

尝试在C#服务器端获取数据:

protected void Page_Load(object sender, EventArgs e)
{
    string[] keys = Request.Form.AllKeys;  // only username and password keys received.

    for (int i = 0; i < keys.Length; i++)
    {
         string [] tmp = Request.Form.GetValues (keys[i]);
    }
}

我可以在Request(用户名和密码)中获取TextBody部分键和值。但没有收到BinaryBody密钥或数据。我不知道为什么?

2 个答案:

答案 0 :(得分:2)

您正在检查表单变量,其中您的代码创建了一个在HTTP请求正文中发送的blob。正文不是表单变量,它只是标题后面的HTTP请求中的内容。

HttpRequest了解HTTP请求的内容,并通过其属性公开各个部分,例如CookiesFilesFormHeaders

如果您的代码将二进制数据作为文件发送,请检查Files属性。否则,您可以使用InputStream属性读取正文的内容。

假设数据可以在文件中找到,HttpPostedFile.InputStream的文档描述了如何阅读文件:

var files=Request.Files;
var aFile=files[0];

var length = aFile.ContentLength;
byte[] input = new byte[length];

aFile.InputStream.Read(input,0,length);

InputStream只是一个流,因此您可以将其内容复制到缓冲区中,将其写入磁盘等

答案 1 :(得分:0)

<强>解决方案:

HttpFileCollection MyFiles = Request.Files;
// ...
for (int l = 0; l < MyFiles.Count; l++)
{
    if (MyFiles.GetKey(l) == "file")
    {
        HttpPostedFile file = MyFiles.Get("file");
        // ...
    }
}