使用 JSON.net 写入 HttpClient 请求流

RVa*_*een 5 c# json

我有一些相当大的 json 需要通过 post 请求发送到 Api。

使用 C# (Xamarin) 我想将此 Json 直接写入请求流。

我尝试实现自定义 HttpContent,但我要么收到“无法从关闭的流中读取”异常(当我使用 dispose 时),要么收到空正文。

请不要建议使用 PushStreamContent,我无法在 Xamarin 中访问它,我也希望了解这一点。

例如:

public class JsonContent : HttpContent
{
    public object SerializationTarget { get; private set; }
    public JsonContent(object serializationTarget)
    {
        SerializationTarget = serializationTarget;
        this.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    }
    protected override async Task SerializeToStreamAsync(Stream stream, TransportContext context)
    {
        using (StreamWriter writer = new StreamWriter(stream))
        using (JsonTextWriter jsonWriter = new JsonTextWriter(writer))
        {
            JsonSerializer ser = new JsonSerializer();
            ser.Serialize(jsonWriter, SerializationTarget);
        }



    // Should I dispose here or not ? When I do, the stream is 'closed'

    // When I do not dispose, the body seems to be empty

    // Should I Wrap this in a await Task.Run(() => {});
    // To make it 'async'






    }

    protected override bool TryComputeLength(out long length)
    {
        //we don't know. can't be computed up-front
        length = -1;
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

经过一番摆弄后,我让它可以处理以下内容:

public class JsonContent : HttpContent
{
    public object SerializationTarget { get; private set; }
    public JsonContent(object serializationTarget)
    {
        SerializationTarget = serializationTarget;
        this.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    }
    protected override async Task SerializeToStreamAsync(Stream stream, TransportContext context)
    {
        JsonSerializer ser = new JsonSerializer();

        StreamWriter writer = new StreamWriter(stream);
        JsonTextWriter jsonWriter = new JsonTextWriter(writer);
        ser.Serialize(jsonWriter, SerializationTarget);
        await jsonWriter.FlushAsync();
    }

    protected override bool TryComputeLength(out long length)
    {
        //we don't know. can't be computed up-front
        length = -1;
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然我还不明白为什么我需要刷新并且不能处理作家。

查看文档

 Product product = new Product();
 product.ExpiryDate = new DateTime(2008, 12, 28);

 JsonSerializer serializer = new JsonSerializer();
 serializer.Converters.Add(new JavaScriptDateTimeConverter());
 serializer.NullValueHandling = NullValueHandling.Ignore;

 using (StreamWriter sw = new StreamWriter(@"c:\json.txt"))
 using (JsonWriter writer = new JsonTextWriter(sw))
 {
     serializer.Serialize(writer, product);
     // {"ExpiryDate":new Date(1230375600000),"Price":0}
 }
Run Code Online (Sandbox Code Playgroud)