gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:46:35 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com