首页 > 解决方案 > 如何在 ASP.Net Core 中将大型 json 对象流式传输到浏览器

问题描述

将大型 json 对象流式传输到浏览器时,防止OutOfMemoryException;在 .Net Framework 中,我能够使用

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();
}

但是当我在 .Net Core 上工作时,我尝试了下面的代码,但它给了我同步操作是不允许的。调用 WriteAsync 或将 AllowSynchronousIO 设置为 true

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();
    }
}

我也试过

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());
}

但它现在抛出响应标头无法修改,因为响应已经开始

如何在 ASP.Net Core 中流式传输我的 json 对象?

标签: jsonasp.net-corestream

解决方案


看起来 Json 实际上并不是我的问题的根本原因,因为在 .Net Core 中它默认已经将流用于 json JsonResultExecutor


推荐阅读