我有一些相当大的 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)
| 归档时间: |
|
| 查看次数: |
1643 次 |
| 最近记录: |