JsonHttpContent с ASP. NET Core 3.1 - PullRequest
       18

JsonHttpContent с ASP. NET Core 3.1

1 голос
/ 09 апреля 2020

Я создал собственный 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);
}

Чего мне здесь не хватает?

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

Похоже, вы пропустили тип _content. Попробуйте это:

protected override Task SerializeToStreamAsync(Stream stream, TransportContext context)
{
    return JsonSerializer.SerializeAsync(stream, _content, _content.GetType(), _options);
}

Метод, который вы вызвали, был на самом деле SerializeAsync<TValue>(...), который использует typeof(TValue) в качестве типа для сериализации. Поскольку ваш _content является экземпляром object, поэтому TValue в этом случае равен object, поэтому _content был сериализован как object. Вот почему вы видите только {}.

Исправление вызывает другую перегрузку SerializeAsync(...), которая позволяет вам указать правильный тип для сериализации.

0 голосов
/ 12 апреля 2020

Содержит ли ваш объект поля или свойства .. System.Text. Json не будет сериализовать поля ..

...