我正在处理一些文件并从一种格式转换为另一种格式。我的函数是逻辑应用程序中的一个步骤,我的函数输出导致正在创建一个文件,使用预定义的步骤"创建文件(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
我想知道这个想法是不是很好?至少我现在正在思考的是,我无法弄清楚如何去做。
干杯
答案 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
最适合您的工作负载。