Портирование реализации класса из asp.net mvc в ядро ​​asp.net mvc - PullRequest
0 голосов
/ 11 апреля 2019

Я пытался реализовать подкласс ActionResult, который будет передавать большие объекты JSON из REST API, я нашел это решение при переполнении стека, но похоже, что это реализация для 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 MVC, я обнаружил, что класс ответа не имеет ContentEncoding и OutputStream свойств.

Пожалуйста, кто-нибудь может предоставить необходимые изменения для переноса этого класса в ядро ​​asp.net?

Заранее спасибо.

1 Ответ

0 голосов
/ 12 апреля 2019

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

Обновление

Согласно исходный код , JsonResultExecutor внутренне делает именно то, что я описал, единственное отличие состоит в том, что он анализирует кодировку из ContentType.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...