使用dotnet Core 3 System.Text.Json Api流式传输JSON

时间:2019-12-05 16:32:41

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

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

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

        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;
        }

但是,当将其放入服务器时,似乎没有写入任何内容。

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

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

1 个答案:

答案 0 :(得分:2)

我想您当前的代码不起作用的原因是,您没有在序列化后将流位置重置为0。但是,由于创建了$brokerTables = ['test1' => 'broker_report', 'test2' => 'choice_report', 'test3' => 'odit_report', 'test4' => 'other_insurer_report']; foreach ($brokerTables as $folder => $table) { require_once($folder . '/classes/' . $brokerTables[$folder]); $pdfdoc = new PdfCreator($this->conn); // use $pdfdoc.. }; ,因此您仍在序列化内存中的JSON。

通过引用NuGet软件包MemoryStream,可以使用

PushStreamContent

尝试类似的东西:

Microsoft.AspNet.WebApi.Client