使用HttpWebRequest的FileUpload返回(411)Length Required Error

时间:2011-07-19 18:11:47

标签: file-upload httpwebrequest

我编写了一个ActiveX控件,支持拖放电子邮件附件和磁盘文件,并将文件上传到Web服务器。 我使用此链接提供的示例来上传文件

Upload files with HTTPWebrequest (multipart/form-data)

我通过设置以下属性

以块的形式发送数据
            wr = (HttpWebRequest)WebRequest.Create(UploadUrl);
            wr.ContentType = "multipart/form-data; boundary=" + boundary;
            wr.Method = "POST";
            wr.ContentLength = contentLength;
            wr.AllowWriteStreamBuffering = false;
            wr.Timeout = 600000;
            wr.KeepAlive = false;
            wr.ReadWriteTimeout = 600000;
            wr.ProtocolVersion = HttpVersion.Version10;
            wr.Credentials = System.Net.CredentialCache.DefaultCredentials;
            wr.SendChunked = true;
            wr.UserAgent = "Mozilla/3.0 (compatible; My Browser/1.0)";
            rs = wr.GetRequestStream();

使用上述设置我收到错误(411)长度要求。

阅读下面的文章后,我意识到,当我设置SendChunked = true时,我不需要设置Content-Length属性;

http://en.wikipedia.org/wiki/Chunked_transfer_encoding

但是这里的Microsoft示例代码没有这样做

http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.sendchunked.aspx

在进一步挖掘后,我发现只有HTTP版本1.1支持Chunked编码。所以我改变了属性如下 wr.ProtocolVersion = HttpVersion.Version11;

现在我不再看到411错误了。

现在,知识渊博的人可以在这里验证我的理解,如果我做得对,请告诉我。

由于 拉维。

1 个答案:

答案 0 :(得分:0)

它们都是让接收者知道何时到达传输结束的机制。如果您想使用Content-Length,则非常简单。只需获取POST数据的编码字节数组,并使用Length属性。

ASCIIEncoding encoding = new ASCIIEncoding ();
byte[] postDataByteArray = encoding.GetBytes (postData); 
wr.ContentLength = postDataByteArray.Length;