请问一下,发送POST请求后读取返回值的时候,写入流的字节超出指定的 Content-Length 字节大小,怎么办

    IEnumerator ApiPost(string Json)
    {
        HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("https://api-free.deepl.com/v2/translate");

        byte[] Jsongby = Encoding.UTF8.GetBytes(Json);

        //将ApiKey(String)转化为base64编码添加为消息头
        httpWebRequest.Headers.Add(HttpRequestHeader.Authorization, "DeepL-Auth-Key ---");

        httpWebRequest.UserAgent = "YourApp/1.2.3";

        //定义请求类型(POST)
        //内容长度(ContentLength),Timeout(响应时间)
        httpWebRequest.Method = "POST";
        httpWebRequest.ContentType = "application/json";
        httpWebRequest.ContentLength = Jsongby.Length;
        httpWebRequest.Timeout = Jsongby.Length + 10000;

        //写入数据
        Stream writer = httpWebRequest.GetRequestStream();
        writer.Write(Jsongby, 0, Jsongby.Length);
        writer.Close();

        var Task1 = httpWebRequest.GetRequestStreamAsync().Result.WriteAsync(Jsongby, 0, Jsongby.Length);
        yield return new WaitUntil(()=> Task1.IsCompleted);

        //接受返回值
        var Task2 = httpWebRequest.GetResponseAsync();
        yield return new WaitUntil(() => Task2.IsCompleted);
        Stream stream = ((HttpWebResponse)Task2.Result).GetResponseStream();//报错点
        StreamReader reader = new StreamReader(stream, Encoding.UTF8);
        string value = reader.ReadToEnd();
        Debug.Log(value);

        //关闭流和Http连接
        stream.Close();
        reader.Close();
        httpWebRequest.Abort();
        yield return null;
    }

请问一下,发送POST请求后读取返回值的时候,写入流的字节超出指定的 Content-Length 字节大小
这个怎么办哇

httpWebRequest.ContentLength = Jsongby.Length;
删除这一行看看

看样子你应该发现了官方的一个设定,iexxxx迭代不能了,不让你yield reten await
想想官方为啥有这个设定把。
因为迭代器是延后的,异步的东西上下文会不一样

虽然你变着法没用await骗过了编译器,但你骗不过运行期,运行期上下文变了

【以下回答由 GPT 生成】

问题解决方案:

在你提供的代码中,发送POST请求前已经将Json数据写入流中,所以在以下这行代码中,你无需再次调用GetRequestStreamAsync().Result.WriteAsync(Jsongby, 0, Jsongby.Length)这段代码:

var Task1 = httpWebRequest.GetRequestStreamAsync().Result.WriteAsync(Jsongby, 0, Jsongby.Length);
yield return new WaitUntil(() => Task1.IsCompleted);

解决方法是:删除上面这段代码。

在读取返回值之前,你已经将Json数据写入请求流中了。所以,在以下这行获取返回值的代码中,可以直接调用httpWebRequest.GetResponseAsync()获取返回值:

//接受返回值
var Task2 = httpWebRequest.GetResponseAsync();
yield return new WaitUntil(() => Task2.IsCompleted);
Stream stream = ((HttpWebResponse)Task2.Result).GetResponseStream(); //报错点

将以上部分代码修改为以下代码:

//接受返回值
HttpWebResponse response = (HttpWebResponse)httpWebRequest.GetResponse();
Stream stream = response.GetResponseStream();

这样就能够成功获取到返回的数据了。

完整的修改后的代码如下:

IEnumerator ApiPost(string Json)
{
    HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("https://api-free.deepl.com/v2/translate");

    byte[] Jsongby = Encoding.UTF8.GetBytes(Json);

    //将ApiKey(String)转化为base64编码添加为消息头
    httpWebRequest.Headers.Add(HttpRequestHeader.Authorization, "DeepL-Auth-Key ---");

    httpWebRequest.UserAgent = "YourApp/1.2.3";

    //定义请求类型(POST),内容长度(ContentLength),Timeout(响应时间)
    httpWebRequest.Method = "POST";
    httpWebRequest.ContentType = "application/json";
    httpWebRequest.ContentLength = Jsongby.Length;
    httpWebRequest.Timeout = Jsongby.Length + 10000;

    //写入数据
    Stream writer = httpWebRequest.GetRequestStream();
    writer.Write(Jsongby, 0, Jsongby.Length);
    writer.Close();

    //接受返回值
    HttpWebResponse response = (HttpWebResponse)httpWebRequest.GetResponse();
    Stream stream = response.GetResponseStream();

    StreamReader reader = new StreamReader(stream, Encoding.UTF8);
    string value = reader.ReadToEnd();
    Debug.Log(value);

    //关闭流和Http连接
    stream.Close();
    reader.Close();
    httpWebRequest.Abort();
    yield return null;
}

希望以上解决方案能够帮助到你,如果有任何疑问,请随时提出。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^