c# - 将内容流式传输为 Azure 函数输出

标签 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 向它发出请求时,我只是得到“无法加载响应”。如果一切顺利的话,我期待的是 csv 输出之类的东西,例如

John, Doe, 123
Mary, Jane, 456

我想知道这个想法到底好不好?至少我现在是这么想的,只是不知道该怎么做。

干杯

最佳答案

您使用StreamWriter的方式导致MemoryStream被释放。默认情况下,StreamWriter 假定它所传递的 Stream 的所有权,并在释放(或 GC)时释放它。

您需要使用采用 (Stream, Encoding, int, bool) 的构造函数重载,其中 bool 名为 leaveOpen您需要将其设置为true。我必须仔细检查,但没有比 (Stream, bool) 更简单的重载。您可能想做类似的事情:

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

但是,您应该真正决定哪种编码最适合您,以及哪种 bufferSize 对您的工作负载最有意义。

关于c# - 将内容流式传输为 Azure 函数输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48461021/

相关文章:

asp.net - 将子域重定向到azure web应用程序中的子文件夹

python - 从 Android 客户端调用在 Azure VM 中运行的 python 函数

azure - 需要澄清 Azure Functions 生态系统

c# - log4net 滚动文件追加器(按日期)覆盖现有文件

asp.net - 是否可以将 Azure 连接到 google 云端硬盘?

c# - 有没有一种简单的方法将事件与 ListViewItem 关联?

azure - 根据传递到 Azure 数据工厂 v2 管道的运行时参数生成和存储 JSON 文件?

Azure Function 消耗计划限制

c# - 如何在 C# 控制台应用程序中执行 telnet

c# - 没有映射到数据操作中使用的列 'CleaningEmployees.Id' 的属性