我目前有一条路由返回存储在protobuf文件中的日期数据存档。
目前,我使用PushStreamContent
将结果写回json。这是我目前做的::
[HttpGet,Route(...)]
public async Task<HttpResponseMessage>(
string asset,
DateTime archiveDate,
CancellationToken token
){
var archivedData = await _archiveService.GetArchivedData(asset,archiveDate,token);
if(archivedData == null){
return await NotFound().ExecuteAsync(token).ConfigureAwait(false);
}
var response = Request.CreateResponse(HttpStatusCode.OK);
var res = ConvertToWire(asset,archivedData);
var typeFormatter = Configuration.Formatters.First();
response.Content = new PushStreamContent(async (stream, content, transport) =>
{
using (var outerStream = new BufferedStream(stream, 8*1024))
{
await typeFormatter.WriteToStreamAsync(res.GetType(), res, outerStream,
content, transport, token).ConfigureAwait(false);
}
stream.Close();
}, JsonUtf8);
return response;
};
ConvertToWire基本上了解我们支持的资产,并应用有线格式并将其返回为IEnumerable<T>
。我可以相当轻松地返回IQueryable<T>
(res.ToQueryable()
)。通过这种方法,我可以非常轻松地将数据流出文件。
如何添加对Odata的支持,同时仍保持流式传输结果集的能力。一些资产具有非常大的文件大小(50+ mb),因此需要流式传输。