System.Net.ProtocolViolationException:在调用 GetResponse之前,必须将ContentLength字节写入请求流

我得到了

“System.Net.ProtocolViolationException:在调用Web请求的”BeginGetResponse“方法时,必须在调用[Begin] GetResponse”错误之前将ContentLength字节写入请求流。

这是我的代码:

try { Stream dataStream = null; WebRequest Webrequest; Webrequest = WebRequest.Create(this.EndPointAddress); Webrequest.Credentials = new NetworkCredential(this.username, this.password); Webrequest.ContentType = "text/xml"; Webrequest.Method = WebRequestMethods.Http.Post; byteArray = System.Text.Encoding.UTF8.GetBytes(xmlRequest.Children[0].InnerXML); Webrequest.ContentLength = byteArray.Length; dataStream = Webrequest.GetRequestStream(); dataStream.Write(byteArray, 0, byteArray.Length); RequestState rs = new RequestState(); rs.Request = Webrequest; IAsyncResult r = (IAsyncResult)Webrequest.BeginGetResponse(new AsyncCallback(RespCallback), rs); } catch (Exception exc) { TRACE.EXCEPTION(exc); } finally { dataStream.Close(); } 

更具体地说,在调用函数“getRequestStream()”之后,Stream正在为长度抛出此exception:

‘stream.Length’抛出了’System.NotSupportedException’类型的exception

可能是什么原因造成的?

这最终通过使用:

 using (dataStream = Webrequest.GetRequestStream()) { dataStream.Write(byteArray, 0, byteArray.Length); } 

代替:

 dataStream = Webrequest.GetRequestStream(); dataStream.Write(byteArray, 0, byteArray.Length); 

您的代码应该适用于.NET 2.0从4.0及更高版本,您应该在写完后关闭该流:

 dataStream = Webrequest.GetRequestStream(); dataStream.Write(byteArray, 0, byteArray.Length); datastream.Close(); 

检查以validation您的服务器已设置为接受大文件。 您可能会发现您遇到了4兆时的默认限制。

将以下内容添加到web.config文件中以进行更大的文件上载: