【问题标题】:How to stream large json object to browser in ASP.Net Core如何在 ASP.Net Core 中将大型 json 对象流式传输到浏览器
【发布时间】:2021-02-16 15:55:24
【问题描述】:

当流大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 对象?

【问题讨论】:

  • 如果数据是可拆分的,可以尝试多次发送。

标签: json asp.net-core stream


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 2010-09-14
    • 1970-01-01
    • 2017-03-06
    • 2018-12-19
    • 2019-09-25
    • 2012-02-17
    相关资源
    最近更新 更多