Я создал собственный HttpContent для эффективной отправки объектов с использованием System.Text. Json с HttpClient. К сожалению, очень мало документации о том, как правильно это сделать. Следующий класс приводит к ошибке о искаженных данных JSON в моей конечной точке теста. Просмотр пакетов в wireshark показывает, что передается только пустой объект json ({}
). Я также попытался передать поток sh (тот же результат) или избавиться от него после записи в него (это приводит к ошибке при попытке доступа к удаленному объекту).
using System.IO;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
namespace Common
{
public sealed class JsonContent : HttpContent
{
private readonly object _content;
private readonly JsonSerializerOptions _options;
public JsonContent(object content, JsonSerializerOptions options)
{
_content = content;
_options = options;
Headers.ContentType = new MediaTypeHeaderValue("application/json")
{
CharSet = Encoding.UTF8.WebName
};
}
protected override Task SerializeToStreamAsync(Stream stream, TransportContext context)
{
return JsonSerializer.SerializeAsync(stream, _content, _options);
}
protected override bool TryComputeLength(out long length)
{
length = 0;
return false;
}
}
}
Все это используется так:
public static async Task<HttpResponseMessage> PostAsJsonAsync<T>(this HttpClient client, string url, T content,
CancellationToken ct = default) where T : class
{
return await client.PostAsync(url, new JsonContent(content, Json.DefaultSerializerOptions), ct);
}
Чего мне здесь не хватает?