.net 带有HttpWebRequest的HTTP POST

.net 带有HttpWebRequest的HTTP POST,.net,http,post,httpwebrequest,amazon-s3,.net,Http,Post,Httpwebrequest,Amazon S3,我试图发布一些数据,就像我在HTML站点上使用表单一样(ContentType=multipart/formdata)。目标是亚马逊的s3。 我使用的是HttpWebRequest/HttpWebResponse,对我来说一切似乎都很好,但我仍然无法解决一个问题,我不断得到错误: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>InvalidArgument</Code> <M

我试图发布一些数据,就像我在HTML站点上使用表单一样(ContentType=multipart/formdata)。目标是亚马逊的s3。 我使用的是HttpWebRequest/HttpWebResponse,对我来说一切似乎都很好,但我仍然无法解决一个问题,我不断得到错误:

<?xml version="1.0" encoding="UTF-8"?>
<Error>
  <Code>InvalidArgument</Code>
  <Message>POST requires exactly one file upload per request.</Message>
  <ArgumentValue>0</ArgumentValue>
  <ArgumentName>file</ArgumentName>
</Error>
它似乎是自我描述的,但我确实发送了“文件”字段。我已经设法通过测试网站发送了一个没有问题的文件,整个帖子数据似乎完全相同。 当我通过wireshark“侦察”请求时,所有的标题和帖子数据也都在那里——正如预期的那样

有人知道为什么亚马逊看不到“文件”字段吗

使用的代码(为了使其更具可读性,对其进行了一些剪切):

将数据发布到流:

---------------------------317205771417341028
Content-Disposition: form-data; name="key"

webtest/image.png
---------------------------317205771417341028
Content-Disposition: form-data; name="acl"

public-read
---------------------------317205771417341028
Content-Disposition: form-data; name="AWSAccessKeyId"

AKIAJOQLTUC5H2NJ65NA
---------------------------317205771417341028
Content-Disposition: form-data; name="policy"

Oi8vd3d3Lmdvb2dsZS[...]c3QiXSwNCiAgXQ0KfQ0K
---------------------------317205771417341028
Content-Disposition: form-data; name="Signature"

06GBK5DJ71aB[...]M8Ct8JOE=
---------------------------317205771417341028
Content-Disposition: form-data; name="file"; filename="eclipse.png"
Content-Type: application/octet-stream

‰PNG

IHDRn
[...the rest of the image...]
IEND®B‚
---------------------------317205771417341028
Content-Disposition: form-data; name="submit"

Upload to Amazon S3
---------------------------317205771417341028--
而且。。。wireshark的列表:

OUT TCP 58383 > http [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=2 SACK_PERM=1
IN  TCP http > 58383 [SYN, ACK] Seq=0 Ack=1 Win=8190 Len=0 MSS=1460 WS=6 SACK_PERM=1
OUT TCP 58383 > http [ACK] Seq=1 Ack=1 Win=65700 Len=0
OUT TCP [TCP segment of a reassembled PDU]
IN  HTTP    HTTP/1.1 100 Continue 
OUT TCP [TCP segment of a reassembled PDU]
OUT TCP [TCP segment of a reassembled PDU]
OUT TCP [TCP segment of a reassembled PDU]
OUT TCP [TCP segment of a reassembled PDU]
IN  TCP http > 58383 [ACK] Seq=26 Ack=2031 Win=1331456 Len=0
OUT TCP [TCP segment of a reassembled PDU]
OUT TCP [TCP segment of a reassembled PDU]
IN  TCP http > 58383 [ACK] Seq=26 Ack=3969 Win=1337344 Len=0
OUT TCP [TCP segment of a reassembled PDU]
OUT TCP [TCP segment of a reassembled PDU]
IN  TCP http > 58383 [ACK] Seq=26 Ack=6889 Win=1343232 Len=0
OUT TCP [TCP segment of a reassembled PDU]
OUT TCP [TCP segment of a reassembled PDU]
IN  TCP http > 58383 [ACK] Seq=26 Ack=8441 Win=1346048 Len=0
OUT HTTP    POST / HTTP/1.1
//the one above contains the last bytes added to the stream
IN  TCP http > 58383 [ACK] Seq=26 Ack=10225 Win=1348864 Len=0
IN  TCP http > 58383 [ACK] Seq=26 Ack=10857 Win=1351936 Len=0
IN  TCP http > 58383 [ACK] Seq=26 Ack=12162 Win=1354752 Len=0
IN  TCP http > 58383 [ACK] Seq=26 Ack=13622 Win=1357824 Len=0
IN  TCP http > 58383 [ACK] Seq=26 Ack=13913 Win=1360640 Len=0
IN  TCP [TCP segment of a reassembled PDU]
IN  HTTP/XML    HTTP/1.1 400 Bad Request 
//the one above includes the error info quoted in the beginning
IN  TCP http > 58383 [FIN, ACK] Seq=649 Ack=13913 Win=1360640 Len=0
OUT TCP 58383 > http [ACK] Seq=13913 Ack=650 Win=65052 Len=0
OUT TCP 58383 > http [FIN, ACK] Seq=13913 Ack=650 Win=65052 Len=0
IN  TCP http > 58383 [ACK] Seq=650 Ack=13914 Win=1360640 Len=0

上述报告与基于web应用的上传生成的报告之间的唯一区别是,基于web应用的[TCP段重新组装PDU]位置较少,并且有一些[TCP Dup ACK 156#1]http>58364[ACK]Sq=1 ACK=7017 Win=11668 Len=0条目(如果可能有帮助,我可以发送完整的跟踪)。

将这些信息发布到您自己的服务器,而不是亚马逊,然后检查帖子-我敢打赌你的标题设置不正确,这意味着因为你使用的是多部分表单数据,所以帖子无法被解码

无论如何,您都应该使用官方SDK

解决了! 边界错误-需要为post数据添加比标头中的值多2个破折号。 在上述代码中需要做的是:

string boundary = "---------------------------317205771417341028";
request.ContentType = "multipart/form-data; boundary=" + boundary;
[……]

[……]
很容易。。。然而如此令人讨厌

我连续三天试图解决同一个问题。绝对要确保文章正文格式使用一致的行尾。我忘记了一个CRLF序列中的单回车(
\r
),Amazon S3给了我这个错误和类似的错误。

你有什么理由不想使用Amazon 3S.NET API吗?我真的很想使用SKD,但实际上不可能,因为有两个原因:-据我所知,有必要在应用程序中存储密钥(由于安全原因,这对我们来说是不可能的)-它不支持(或者我看不见)策略设置选项,该选项启用文件大小限制(“仅启用PUT”方法,而需要“POST”)
string boundary = "---------------------------317205771417341028";
request.ContentType = "multipart/form-data; boundary=" + boundary;
using (Stream s = request.GetRequestStream())
{
    boundary = "--" + boundary "\n";