我需要从Azure函数中流式传输JSON而不对对象进行序列化,因为序列化的开销太高了。
代码可以归结为如下所示:

[FunctionName("AzureFunction")]
public static async Task<IActionResult>
Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "v1/function")], HttpRequest req, ILogger log)
{
    MemoryStream outputStream = new MemoryStream();
    StreamWriter writer = new StreamWriter(outputStream);
    JsonWriter jsonWriter = new JsonTextWriter(writer);

    jsonWriter.WriteStartObject();
    jsonWriter.WritePropertyName("Property");
    jsonWriter.WriteValue("Value");
    jsonWriter.WriteEndObject();

    outputStream.Seek(0, SeekOrigin.Begin);
    return new FileStreamResult(outputStream, "application/json");
}


但是,此JSON会在碰到某些点之前转换为字符串。我已经能够将另一个HTTP调用中的流直接传递到FileStreamResult对象,并且该对象不会转换为字符串,因此我确定这是可能的。

最佳答案

我想通了,在返回之前需要刷新Stream。正确的代码如下所示:

[FunctionName("AzureFunction")]
public static async Task<IActionResult>
Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "v1/function")], HttpRequest req, ILogger log)
{
    MemoryStream outputStream = new MemoryStream();
    StreamWriter writer = new StreamWriter(outputStream);
    JsonWriter jsonWriter = new JsonTextWriter(writer);

    jsonWriter.WriteStartObject();
    jsonWriter.WritePropertyName("Property");
    jsonWriter.WriteValue("Value");
    jsonWriter.WriteEndObject();

    jsonWriter.Flush(); // Flush the json before returning.
    outputStream.Seek(0, SeekOrigin.Begin);
    return new FileStreamResult(outputStream, "application/json");
}

关于c# - .NET Azure函数-如何从流返回JSON对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53158819/

10-12 00:27
查看更多