【发布时间】: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 时,我发现 响应类没有 ContentEncoding 和 OutputStream 属性。
请问,谁能提供将此类移植到 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