首页 > 解决方案 > PutObjectAsync 在第一次运行时停止运行代码 - 无异常抛出

问题描述

我正在尝试使用 MemoryStream 和 XMLWriter 创建一个 XML,然后将 MemoryStream 传递给 PutObjectRequest 但总是在它运行的第一个 lambda 函数在尝试使用 PutObjectAsync 后停止运行,没有发生异常。如果我第二次再次调用测试函数,它就可以工作。

因为我想触发它​​定期运行,所以它永远不会创建 XML 文件并将其保存到我尝试生成的存储桶中。似乎需要运行2次,一个接一个。

现在有人对我的代码有什么问题吗?

try{
    var fileNameBuilder = string.Format("{0}.{1}-WL.xml", coItem.ToString(), fileEmissionDatetimeString);

 using (MemoryStream memStream = new MemoryStream())
                    using (XmlWriter writer = XmlWriter.Create(memStream, XMLHelper.xmlWriterSettings))
                    {
                        context.Logger.LogLine($"Writing file: " + fileNameBuilder);
                        writer.WriteProcessingInstruction("xml", "version=\"1.0\" encoding=\"iso-8859-1\"");
                        writer.WriteStartElement("data");
                        writer.WriteAttributeString("source", "1");
                        writer.WriteAttributeString("target", "0");

                        writer.WriteStartElement("list");
                        writer.WriteAttributeString("item_nb", CoLists.Count.ToString());


                        writer.WriteStartElement("co");
                        writer.WriteAttributeString("id", coItem.ToString());
                        writer.WriteAttributeString("constitution", fileEmissionDatetimeString);
                        writer.WriteAttributeString("item_nb", items.Where(i => i.Id == coItem).Count().ToString());

                        foreach (var item in items.Where(i => i.Id == coItem))
                        {
                            writer.WriteStartElement("item");
                            writer.WriteAttributeString("cm", item.ContextMark);
                            writer.WriteAttributeString("obu", item.HexAlias);
                            writer.WriteAttributeString("vc", item.VehicleClass.ToString());
                            writer.WriteAttributeString("vrn", item.VehicleRegistration);
                            writer.WriteEndElement();
                            XMLRows++;
                        }

                        writer.WriteEndElement();
                        writer.WriteEndElement();
                        writer.WriteEndElement();

                        writer.WriteEndDocument();
                        writer.Flush();
                        writer.Close();

                        context.Logger.LogLine($"XMLRows: " + XMLRows);

                        PutObjectRequest request = new PutObjectRequest
                        {
                            BucketName = SrcFilesBucket,
                            Key = SrcXMLPathBucket + "/" + fileNameBuilder,
                            ContentType = "text/xml",
                            InputStream = memStream
                        };

                        // Put object
                        var res = await _s3Client.PutObjectAsync(request);

                        if (res.HttpStatusCode == System.Net.HttpStatusCode.OK)
                        {
                            context.Logger.LogLine($"Finished coItem: " + coItem + " | File: " + fileNameBuilder);
                        }
 }
            catch (AmazonS3Exception amazonS3Exception)
            {
                if (amazonS3Exception.ErrorCode != null && (amazonS3Exception.ErrorCode.Equals("InvalidAccessKeyId") || amazonS3Exception.ErrorCode.Equals("InvalidSecurity")))
                {
                    throw new SecurityException("Invalid Amazon S3 credentials - data was not uploaded.", amazonS3Exception);
                }

                throw new HttpRequestException("Unspecified error attempting to upload data: " + amazonS3Exception.Message, amazonS3Exception);
            }
            catch (Exception ex)
            {
                context.Logger.LogLine($"ERROR - During generation of XML.");
                context.Logger.LogLine(ex.Message);
                context.Logger.LogLine(ex.StackTrace);
                throw ex;
            }

现在有人对我的代码有什么问题吗?

标签: c#amazon-s3aws-lambda

解决方案


推荐阅读