gpt4 book ai didi

c# - 我可以在没有 HttpClient 缓冲整个请求的情况下将 PushStreamContent 添加到 MultipartFormDataContent 吗?

转载 作者:太空宇宙 更新时间:2023-11-03 23:10:45 27 4
gpt4 key购买 nike

我正在尝试使用 MultipartFormDataContent 在 HTTP POST 中发送一个大文件以及一些其他数据。为了以 block 的形式发送文件,我使用了 PushStreamContent,它将文件流中的数据 block 写入输出流,并在每次写入后刷新:

PushStreamContent pushStreamContent = new PushStreamContent((stream, content, context) => {
byte[] buffer = new byte[4096];
int bytesRead;
do {
bytesRead = fileStream.Read(buffer, 0, 4096);
stream.Write(buffer, 0, bytesRead);
stream.Flush();
}
while(bytesRead != 0);
stream.Close();
});

如果我使用以下代码发布此 HttpContent,一切正常:

new HttpClient().PostAsync(destinationUrl, pushStreamContent);

但是,如果将此 PushStreamContent 添加到 MultipartFormDataContent,如下所示:

MultipartFormDataContent postForm = new MultipartFormDataContent {
{stringContent, "atom"},
{pushStreamContent, "binary"}
};

that 已发布,然后我在 PushStreamContent 的 lambda 中收到 OutOfMemoryException。据推测,HttpClientMultipartFormDataContent整个 缓冲到内存中,但由于请求内容非常大而失败。我希望客户端推迟刷新包含的 PushStreamContent。这可能吗?我正在使用 .NET 4.5。

最佳答案

请求正在缓冲,因为 HttpClient 需要知道请求的总长度才能设置 Content-Length header 。 PushStreamContent 对象 always returns false对于 TryComputeLength(out long)

因此解决方案是创建 PushStreamContent 的子类,确实知道它的长度:

class PushStreamContentWithLength : PushStreamContent {
public PushStreamContentWithLength(Action<Stream, HttpContent, TransportContext> onStreamAvailable, long streamLength) : base(onStreamAvailable) {
mStreamLength = streamLength;
}

readonly long mStreamLength;

protected override bool TryComputeLength(out long length) {
length = mStreamLength;
return true;
}
}

如果将其中一个添加到 MultipartFormDataContent,数据将在 HTTP post 期间被推送到流中,而不是预先加载到内存中。

关于c# - 我可以在没有 HttpClient 缓冲整个请求的情况下将 PushStreamContent 添加到 MultipartFormDataContent 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39290342/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com