首页 > 解决方案 > 将类实现从 asp.net mvc 移植到 asp.net mvc 核心

问题描述

我试图实现一个 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核心所需的更改吗?

提前致谢。

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

解决方案


OutputStream -ASP.NET Core HttpResponse包含Body可以写入响应的属性。ContentEncoding - 设置编码,StreamWriter因为您手动将结果写入响应流。InASP.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();
        }
    }
}

更新

根据源代码JsonResultExecutor内部完全按照我的描述进行,唯一的区别是它从ContentType.


推荐阅读