How to stream large json object to browser in ASP.Net Core

Viewed 1018

When stream large json object to browser, to prevent OutOfMemoryException; in .Net Framework, I was able to use

public static void StreamJsonThenEnd(this HttpResponseBase httpResponse, object data)
{
    httpResponse.ContentType = "application/json";
    using (StreamWriter writer = new StreamWriter(httpResponse.OutputStream))
    using (JsonTextWriter jsonWriter = new JsonTextWriter(writer))
    {
        JsonSerializer ser = new JsonSerializer();
        ser.Serialize(jsonWriter, data);
        jsonWriter.Flush();
    }
    httpResponse.End();
}

But when I worked on .Net Core, I tried below code but it gave me Synchronous operations are disallowed. Call WriteAsync or set AllowSynchronousIO to true instead

public static void StreamJsonThenEnd(this HttpResponse httpResponse, object data)
{
    httpResponse.ContentType = "application/json";
    httpResponse.StatusCode = StatusCodes.Status200OK;
    using (StreamWriter writer = new StreamWriter(httpResponse.Body))
    using (JsonTextWriter jsonWriter = new JsonTextWriter(writer))
    {
        JsonSerializer ser = new JsonSerializer();
        ser.Serialize(jsonWriter, data);
        jsonWriter.Flush();
    }
}

I also tried

public static async Task StreamJsonThenEnd(this HttpResponse httpResponse, object data)
{
    httpResponse.ContentType = "application/json";
    httpResponse.StatusCode = StatusCodes.Status200OK;
    await System.Text.Json.JsonSerializer.SerializeAsync(httpResponse.Body, data, data.GetType());
}

but it now throw The response headers cannot be modified because the response has already started

How can I stream my json object in ASP.Net Core?

1 Answers

Look like Json is not actually root cause of my problem, as in .Net Core it already used stream for json by default JsonResultExecutor

Related