【问题标题】:Porting a class implementation from asp.net mvc to asp.net mvc core将类实现从 asp.net mvc 移植到 asp.net mvc 核心
【发布时间】:2019-04-11 11:26:07
【问题描述】:

我试图实现 ActionResult 的子类,它将从 REST API 流式传输大型 JSON 对象,我在堆栈溢出时找到了这个解决方案,但它似乎是 asp.net MVC 的实现。

public class JsonStreamingResult : ActionResult
{
    private IEnumerable itemsToSerialize;

    public JsonStreamingResult(IEnumerable itemsToSerialize)
    {
        this.itemsToSerialize = itemsToSerialize;
    }

    public override void ExecuteResult(ActionContext context)
    {
        var response = context.HttpContext.Response;
        response.ContentType = "application/json";
        response.ContentEncoding = Encoding.UTF8;

        JsonSerializer serializer = new JsonSerializer();

        using (StreamWriter sw = new StreamWriter(response.OutputStream))
        using (JsonTextWriter writer = new JsonTextWriter(sw))
        {
            writer.WriteStartArray();
            foreach (object item in itemsToSerialize)
            {
                JObject obj = JObject.FromObject(item, serializer);
                obj.WriteTo(writer);
                writer.Flush();
            }
            writer.WriteEndArray();
        }
    }
}

但是当我将它移植到 asp.net core MVC 时,我发现 响应类没有 ContentEncodingOutputStream 属性。

请问,谁能提供将此类移植到 asp.net 核心所需的更改?

提前致谢。

【问题讨论】:

  • 您确定一开始就需要它吗?当您调用 return Json(someObject) 时,您会返回一个 JsonResult 对象,该对象最终将 uses a JsonWriter 写入响应输出流。您是否尝试过以正常方式返回数据?
  • @PanagiotisKanavos 请看这个问题,我也有同样的问题:stackoverflow.com/questions/26269438/…
  • 这个问题与 ASP.NET Core 无关,问题是由尝试手动序列化数据引起的。你有实际问题吗?您是否尝试过使用return Json()?我发布了指向显示 ASP.NET Core已经写入输出流的源代码的链接
  • 你怎么知道的?您是否为整个动作执行或序列化部分计时?如果连接速度很慢,则检索数据将花费大量时间。如果加载数据很慢,那么无论数据如何序列化,整个操作都会花费很多时间。您必须分析您的代码,或者至少对其进行调试,看看实际花费了这么长时间。
  • 一次返回这么多数据怎么样? JSON 相当冗长:不像 XML 那样冗长,但这并不能说明什么。返回 20,000 个 JSON 对象需要一段时间——不管你做什么。这里正确的方法是page 结果。一次返回 100 个,然后允许客户端在他们真正需要时请求 100 个结果的下一个“页面”。无论如何,这样的效率要高得多,因为实际上需要全部 20,000 个是很少见的。

标签: c# asp.net-mvc asp.net-core


【解决方案1】:

OutputStream - 在ASP.NET Core HttpResponse 中包含您可以写入响应的Body 属性。 ContentEncoding - 为StreamWriter 设置编码,因为您手动将结果写入响应流。在ASP.NET MVC HttpResponse.ContentEncoding 仅在您调用HttpResponse.Write 方法时使用。

public class JsonStreamingResult : ActionResult
{
    private IEnumerable itemsToSerialize;

    public JsonStreamingResult(IEnumerable itemsToSerialize)
    {
        this.itemsToSerialize = itemsToSerialize;
    }

    public override void ExecuteResult(ActionContext context)
    {
        var response = context.HttpContext.Response;
        response.ContentType = "application/json";

        JsonSerializer serializer = new JsonSerializer();

        using (StreamWriter sw = new StreamWriter(response.Body, Encoding.UTF8))
        using (JsonTextWriter writer = new JsonTextWriter(sw))
        {
            writer.WriteStartArray();
            foreach (object item in itemsToSerialize)
            {
                JObject obj = JObject.FromObject(item, serializer);
                obj.WriteTo(writer);
                writer.Flush();
            }
            writer.WriteEndArray();
        }
    }
}

更新

根据source codeJsonResultExecutor 内部完全按照我的描述进行,唯一的区别是它解析来自ContentType 的编码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    相关资源
    最近更新 更多