将内容流式传输为Azure功能输出

时间:2018-01-26 12:03:08

标签: c# azure azure-functions

我正在处理一些文件并从一种格式转换为另一种格式。我的函数是逻辑应用程序中的一个步骤,我的函数输出导致正在创建一个文件,使用预定义的步骤"创建文件(FTP)"文件内容是我的函数体。

我正在尝试改变我的功能目前的工作方式,以获得一个内存友好版本。我试图实现某种形式的流媒体'因此,在反序列化时,我基本上只在给定时间内在内存中有一个对象。

我尝试了下面的内容,虽然它没有抛出任何错误,但我没有得到预期的输出。

[FunctionName("Transform")]
public static async Task<HttpResponseMessage> Import([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequestMessage req, TraceWriter log)
{

    var doc = XDocument.Load(await req.Content.ReadAsStreamAsync());
    var memoryStream = new MemoryStream();

    if (doc.Root != null)
    {
        var ns = doc.Root.GetDefaultNamespace();
        var query = from c in doc.Descendants(ns + "person")
                    select c;

        var serializer = new XmlSerializer(typeof(Person));
        var persons = new List<Person>();

        foreach (var Person in query)
        {
            var personRecord = (Person)serializer.Deserialize(person.CreateReader());
            persons.Add(personRecord);
        }


        using (var streamWriter = new StreamWriter(memoryStream))
        using (var csvWriter = new CsvWriter(streamWriter))
        {
            csvWriter.WriteRecords(persons);
            streamWriter.Flush();
            memoryStream.Flush();
        }
    }

    return new HttpResponseMessage()
    {
        StatusCode = HttpStatusCode.OK,
        Content = new StreamContent(memoryStream)
    };
}

当我在本地调试我的函数并通过Postman向它发出请求时,我只是得到一个&#34;无法加载响应&#34;。如果一切顺利的话,我就是期待类似csv输出的东西,例如。

John, Doe, 123
Mary, Jane, 456

我想知道这个想法是不是很好?至少我现在正在思考的是,我无法弄清楚如何去做。

干杯

1 个答案:

答案 0 :(得分:0)

您使用StreamWriter的方式导致MemoryStream被处置掉。默认情况下,StreamWriter会假定其所有权为Stream,并在处理时(或者GC)处理它。

您需要使用构造函数重载,该(Stream, Encoding, int, bool) bool被命名为leaveOpen,而您需要将其设置为true。我不得不仔细检查,但只有(Stream, bool)没有简单的重载。你可能想做类似的事情:

new StreamWriter(memoryStream, Encoding.UTF8Encoding, bufferSize:8192, leaveOpen:true)

但是,您应该确定哪种编码最适合您以及bufferSize最适合您的工作负载。