gpt4 book ai didi

c# - HttpResponseMessage 的处理是调用请求流的处理

转载 作者:行者123 更新时间:2023-12-04 16:23:11 25 4
gpt4 key购买 nike

我有一个方法接受 Stream 参数并将其传递给服务器

public async Task<string> Execute(Stream archive)
{
archive.Seek(0, SeekOrigin.Begin);
using var content = new MultipartFormDataContent();
content.Add(new StreamContent(archive), "file1", "file1");
var result = "";
using (var response = await _client.PostAsync(_uri, content))
{
if (response.IsSuccessStatusCode)
{
var stringResult = await response.Content.ReadAsStringAsync();
result = stringResult;
}
}
// here archive is already disposed
return result;
}

现在我实现这个方法的重试策略。如果调用此方法的外部代码得到 ""作为结果,则它会尝试再次调用此方法。但文件是为那一刻准备的。我看到存档流在处理响应后立即处理。为什么?这个方法后需要外面的stream参数怎么办?

最佳答案

StreamContent 将处理 Stream,如 it's source 中所述.那将是disposed by the MultipartContent .这将在 PostAsync 中处理……整个链。

一个解决方案是将 Stream 子类化并删除 dispose 方法,如提议的那样 here .但您必须确保自己处理原始流!编辑:更新。 Stream 是一个抽象类,所以如果你知 Prop 体的流类型会更容易,例如

public sealed class NoDisposeMemoryStream : MemoryStream
{
protected override void Dispose(bool disposing) { }
}

否则您将需要编写自己的完整 Stream 包装器,见底部。

另一种解决方案是在最里面的 using block 中实现重试机制,在每次失败时重置 archive seek origin。这可能更安全。


    public sealed class NoDisposeStream : Stream
{
private Stream _original;
public NoDisposeStream(Stream original) => _original = original
?? throw new ArgumentNullException(nameof(original));
public override bool CanRead => _original.CanRead;
public override bool CanSeek => _original.CanSeek;
public override bool CanWrite => _original.CanWrite;
public override long Length => _original.Length;
public override long Position { get => _original.Position; set { _original.Position = value; } }
public override void Flush() => _original.Flush();
public override int Read(byte[] buffer, int offset, int count) => _original.Read(buffer, offset, count);
public override long Seek(long offset, SeekOrigin origin) => _original.Seek(offset, origin);
public override void SetLength(long value) => _original.SetLength(value);
public override void Write(byte[] buffer, int offset, int count) => _original.Write(buffer, offset, count);
protected override void Dispose(bool disposing) { }
}

关于c# - HttpResponseMessage 的处理是调用请求流的处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69615311/

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