C# 将内容流作为Azure函数输出

C# 将内容流作为Azure函数输出,c#,azure,azure-functions,C#,Azure,Azure Functions,我正在处理一些文件,并从一种格式转换为另一种格式。My function是logic app中的一个步骤,My function的输出会导致使用预定义步骤“创建文件(FTP)”创建文件,其中文件内容是My function的主体 我正在尝试改变我的函数目前的工作方式,以获得一个内存友好的版本。我试图实现某种形式的“流”,以便在反序列化时,在给定时间内存中基本上只有一个对象 我已经尝试了下面的方法,虽然它没有抛出任何错误,但我没有得到预期的输出 [FunctionName("Transform")

我正在处理一些文件,并从一种格式转换为另一种格式。My function是logic app中的一个步骤,My function的输出会导致使用预定义步骤“创建文件(FTP)”创建文件,其中文件内容是My function的主体

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

我已经尝试了下面的方法,虽然它没有抛出任何错误,但我没有得到预期的输出

[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)
    };
}
我想知道这个主意是否好?至少我现在是这么想的,我就是不知道怎么做


干杯

您使用
StreamWriter
的方式导致
内存流
被处理。默认情况下,
StreamWriter
承担其被移交的
流的所有权,并将在其被处置(或GC'd)时予以处置

您需要使用构造函数重载,该重载接受
(Stream,Encoding,int,bool)
,其中
bool
被命名为
leaveOpen
,您需要将其设置为
true
。我必须仔细检查,但没有更简单的重载,只需
(Stream,bool)
。您可能希望执行以下操作:

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

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

返回时,您的memorystream将关闭。见谢谢@Tewr,它帮助我找到了一个有效的解决方案。
new StreamWriter(memoryStream, Encoding.UTF8Encoding, bufferSize:8192, leaveOpen:true)