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