in aspnet/Microsoft.Samples.XMLA.HTTP/Microsoft.Samples.XMLA.HTTP.Proxy/QueryResult.cs [35:89]
public override async Task ExecuteResultAsync(ActionContext context)
{
context.HttpContext.Response.ContentType = "application/json";
context.HttpContext.Response.StatusCode = (int)HttpStatusCode.OK;
if (gzip)
{
context.HttpContext.Response.Headers.Add("Content-Encoding", "gzip");
}
var streaming = true;
await context.HttpContext.Response.StartAsync();
var responseStream = context.HttpContext.Response.Body;
System.IO.Stream encodingStream = responseStream;
if (gzip)
{
encodingStream = new System.IO.Compression.GZipStream(responseStream, System.IO.Compression.CompressionMode.Compress, false);
}
try
{
if (streaming)
{
await WriteResultsToStream(queryResults, encodingStream, context.HttpContext.RequestAborted, log);
}
else
{
var ms = new MemoryStream();
await WriteResultsToStream(queryResults, ms, context.HttpContext.RequestAborted, log);
ms.Position = 0;
var buf = new byte[256];
ms.Read(buf, 0, buf.Length);
var str = System.Text.Encoding.UTF8.GetString(buf);
log.LogInformation($"buffered query results starting {str}");
ms.Position = 0;
await ms.CopyToAsync(encodingStream);
}
pool.ReturnConnection(con);
await encodingStream.FlushAsync();
await responseStream.FlushAsync();
await context.HttpContext.Response.CompleteAsync();
}
catch (Exception ex)
{
log.LogError(ex, "Error writing results");
con.Connection.Dispose(); //do not return to pool
throw; //too late to send error to client
}
}