- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个方法接受 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/
在 HttpClient 内部使用语句我需要从某个地方解包 HttpResponseMessage。 using (HttpClient client = new HttpClient()) {
我需要您在以下方面提供帮助。近一个月来,我一直在阅读有关任务和异步的内容。 我想尝试在一个简单的 wep api 项目中实现我新获得的知识。我有以下方法,并且它们都按预期工作: public Htt
var request = new HttpRequestMessage(HttpMethod.Get, $"api/Items"); request.Headers.Accept.Add(new M
我有一个方法接受 Stream 参数并将其传递给服务器 public async Task Execute(Stream archive) { archive.Seek(0,
我有如下服务的 MVC 项目: namespace comp.Services { public class CompService { public HttpClie
我已经验证了将 HttpResponseMessage 作为返回类型的文件设置为“编译”,就像他们在这里所说的:Why I cannot use HttpResponseMessage class?
我正在调用一个返回任务的方法,在调用方法中我需要读取字符串形式的响应。 这是我输入的代码: static public async Task Validate(string baseUri,HttpC
在等待新的 HttpClientFactory 解决 HttpClient 的所有问题时, 我仍然找不到是否应该处理 HttpResponseMessage 和 HttpRequestMessage
为什么要实现这个Web API [HttpGet("hello")] public HttpResponseMessage Hello() { var res = new HttpRespon
我正在编写一个 Web API Controller ,现在我有以下代码: public class PicklistsController : ApiController { private
我收到了 System.Net.Http.HttpResponseMessage> 类型的对象, 我如何获得 List ? 我尝试转换 content 属性并通过其 value 属性从 content
HttpResponseMessage r = new HttpResponseMessage(); r.StatusCode = HttpStatusCode.OK; r.Reaso
我正在尝试在我的 Web api 包装器中编写一个方法。我想利用“异步/等待”功能,这样用户界面就不会被阻塞。下面是 Web API 包装器中的代码片段。 public static asyn
我正在尝试从 .NET Core MVC 应用程序进行简单的 API 调用: using (var client = new HttpClient()) { client.BaseAddres
第一次使用.net的Httpclient,感觉很吃力。我已经设法调用服务器并从它接收响应,但一直停留在从响应中读取。这是我的代码: if (Method == HttpVerb.POST)
我想在 HttpResponseMessage 内容中返回一个文件,如下所示: return Request.CreateResponse(HttpStatusCode.OK, {{a file he
应用程序应该从 LoginUser() 接收到 httpresponsemessage 但它变得没有响应。 private void button1_Click(object sender,
我正在计算我的 C# web api 的性能。我写了一个非常简单的 HelloWorld 响应: public class HelloWorldController : ApiController {
我有一个 DelegatingHandler 的实现,它基本上接受一个请求并将其寻址到另一个服务器 ( http://localhost:9999/test/page.php --> http://o
我一直在开发移动应用程序的后端和前端,但在让我的帖子请求正常工作时遇到了问题。我一直在前端使用 Xamarin.Forms,在后端使用 .Net。 客户端代码: var res = await App
我是一名优秀的程序员,十分优秀!