我创建了一个自定义HttpContent,以将System.Text.Json与HttpClient一起有效地发送对象。遗憾的是,关于如何正确执行此操作的文档很少。以下类在我的测试端点处导致有关格式错误的JSON数据的错误。查看wireshark中的数据包显示,仅{}
传输了一个空的json对象()。我还尝试刷新流(相同的结果)或在写入流后对其进行处置(这会导致有关通过tring访问已处置对象的错误)。
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);
}
我在这里想念什么?
看来您错过了的类型_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(...)
,该重载允许您指定要序列化的正确类型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句