我编写了一个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错误了。
现在,知识渊博的人可以在这里验证我的理解,如果我做得对,请告诉我。
由于 拉维。
答案 0 :(得分:0)
它们都是让接收者知道何时到达传输结束的机制。如果您想使用Content-Length
,则非常简单。只需获取POST数据的编码字节数组,并使用Length
属性。
ASCIIEncoding encoding = new ASCIIEncoding ();
byte[] postDataByteArray = encoding.GetBytes (postData);
wr.ContentLength = postDataByteArray.Length;