我正在处理一些文件并将其从一种格式转换为另一种格式。我的函数是逻辑应用中的一个步骤,函数的输出会使用预定义的步骤“创建文件 (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/