【问题标题】:Streaming JSON using the dotnet Core 3 System.Text.Json Api使用 dotnet Core 3 System.Text.Json Api 流式传输 JSON
【发布时间】:2019-12-05 16:32:41
【问题描述】:

我正在使用 dotnet Core 3.x 开发 WPF Web 客户端,并且正在使用 System.Text.Json API。我正在尝试使用Stream 在对象之间传递数据,以尽量减少峰值内存使用量,因为正在发送一些大消息。

到目前为止,我编写的包装器方法如下所示:

        public async Task<TResponse> PutItem<TItem, TResponse>(string path, TItem item)
        {
            HttpResponseMessage response;
            await using (Stream stream = new MemoryStream())
            {
                await JsonSerializer.SerializeAsync(stream, item);
                var requestContent = new StreamContent(stream);
                requestContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                response = await _client.PutAsync(path, requestContent);
            }

            if (!response.IsSuccessStatusCode || response.Content == null)
            {
                return default;
            }

            string content = await response.Content.ReadAsStringAsync();
            TResponse decodedResponse = JsonSerializer.Deserialize<TResponse>(content);
            return decodedResponse;
        }

但是,当 PUT 到服务器时,它似乎没有写入任何内容。

我看到早期 API 的用户使用 PushStreamContent 类,但是这在 dotnet Core 中似乎不存在。

非常感谢任何想法,谢谢!

【问题讨论】:

  • 序列化后是否设置stream.Position = 0
  • 谢谢@dbc 现在解决了这个问题。

标签: c# json .net-core system.text.json


【解决方案1】:

我认为您当前代码不起作用的原因是您在序列化后没有将流位置重置为 0。但是,因为您创建了 MemoryStream,所以您仍在内存中序列化为 JSON。

PushStreamContent 可通过引用 NuGet 包 Microsoft.AspNet.WebApi.Client 获得。

尝试类似:

var requestContent = new PushStreamContent(async (outputStream, httpContext, transportContext) =>
{
    await JsonSerializer.SerializeAsync(outputStream, item);
});
requestContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
var response = await _client.PutAsync(path, requestContent);

【讨论】:

  • 非常感谢您提供的大量信息 - PushStreamContent 上的文档充其量似乎很少!然而,上述解决方案并没有按预期工作。阅读此文档后:blog.stephencleary.com/2016/10/… 似乎有必要在发送流内容之前在 lambda 中调用outputStream.Close()?!请问您可以将此添加到您的答案中吗?谢谢。
  • 我不相信在使用异步委托时会出现这种情况
猜你喜欢
  • 2020-04-22
  • 1970-01-01
  • 2017-11-22
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
  • 1970-01-01
  • 2020-02-01
  • 1970-01-01
相关资源
最近更新 更多