0

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

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

        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 中不存在。

任何想法将不胜感激,谢谢!

4

1 回答 1

3

我想您当前代码不起作用的原因是您在序列化后没有将流位置重置为 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);
于 2019-12-05T16:45:50.400 回答