【发布时间】:2015-02-11 13:52:33
【问题描述】:
如果我有这个控制器:
public class SomeController : ApiController
{
public SomeInfoDto Get()
{
return new SomeInfoDto();
}
}
当我使用 get 请求调用 /api/Some 时,我会在 Content Body 中获得 JSON,因为 JSON.NET 已经为我提供了序列化它。
但是,如果我想发送一个 500 HTTP 代码和一些 JSON 我想我可以这样做:
public HttpResponseMessage Get()
{
return new HttpResponseMessage(HttpStatusCode.InternalServerError)
{
Content = // not sure what to put here
}
}
所以我用谷歌搜索了Content 的内容并找到了这个resource
public class JsonContent : HttpContent
{
private readonly JToken _value;
public JsonContent(JToken value)
{
_value = value;
Headers.ContentType = new MediaTypeHeaderValue("application/json");
}
protected override Task SerializeToStreamAsync(Stream stream,
TransportContext context)
{
var jw = new JsonTextWriter(new StreamWriter(stream))
{
Formatting = Formatting.Indented
};
_value.WriteTo(jw);
jw.Flush();
return Task.FromResult<object>(null);
}
protected override bool TryComputeLength(out long length)
{
length = -1;
return false;
}
}
我可以轻松修改以适合我的目的。
但是,我的问题是,如果我让 SerializeToStreamAsync 在 Web Api 管道的下游使用 JsonConvert.SerializeObject(_value),它会再次被序列化吗?
我已经这样设置了GlobalConfiguration.Configuration:
var formatters = GlobalConfiguration.Configuration.Formatters;
var jsonFormatter = formatters.JsonFormatter;
var settings = jsonFormatter.SerializerSettings;
settings.Formatting = Formatting.Indented;
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
我对@987654334@ 的实现是这样的:
protected override Task SerializeToStreamAsync(Stream stream, TransportContext context)
{
using (var streamWriter = new StreamWriter(stream))
{
streamWriter.WriteAsync(JsonConvert.SerializeObject(this.value)).Wait();
streamWriter.FlushAsync().Wait();
}
return Task.FromResult<object>(null);
}
【问题讨论】:
标签: asp.net json asp.net-web-api asp.net-web-api2