系统.Net.ProtocolViolationException:在调用[Begin]GetResponse之前,您必须向请求流中写入ContentLength字节。

17

当调用Web请求的 "BeginGetResponse" 方法时,我收到了 "System.Net.ProtocolViolationException: 在调用 [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.Length' threw an exception of type 'System.NotSupportedException'

这是什么原因引起的?

请不要在您的帖子中添加“搜索了很多”和“谢谢”。为了显示您的努力,请发布代码(可以与当前帖子中的代码相同)以及您尝试过的解决方案链接,同时附上简短的句子说明它为什么没有解决您的问题。 - Alexei Levenkov
那个问题解释的是一个不同的错误,所以它不是重复的。 - user3815821
3个回答

18

最终通过使用以下方法解决了问题:

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

与其:

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

2
因为在后一种情况下,我认为流没有被正确地刷新。 - Amit Kumar Ghosh

4

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

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

1

请检查您的服务器是否设置为接受大文件。您可能会发现您正在遇到4兆默认限制。

为了上传更大的文件,请在您的web.config文件中添加以下内容:

<system.webServer>
    <security>
        <requestFiltering>
            <requestLimits maxAllowedContentLength="104857600" />
        </requestFiltering>
    </security>
</system.webServer>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接