我正在开发一个api,它必须在某个端点上返回csv文件。这是我负责csv生成的控制器:

    [ApiController]
    [Route("api/[controller]")]
    [Authorize]
    public sealed class ReportController : BaseController
    {
        public ReportController(ICommandBus commandBus,
            IQueryBus queryBus)
                : base(commandBus, queryBus)
        {
        }

        [HttpGet]
        public async Task<IActionResult> GetReportAsync([FromQuery] GenerateReportRequest request)
        {
            try
            {
                var report = await QueryBus
                    .SendAsync<GenerateReportQuery, Report>(new GenerateReportQuery
                    {
                        Filters = request.Filters,
                        ResponseFileFormat = request.ResponseFileFormat,
                        WithPodOnly = request.WithPodOnly
                    });

                return File(report.Content,
                    report.Type,
                    report.Name);
            }
            catch (Exception e)
            {
                // ToDo: Handle exception in proper way
                return StatusCode(StatusCodes.Status500InternalServerError,
                    e.Message);
            }
        }
    }

当请求到达我的api时,将调用某些处理程序,并且csv生成将在CsvGenerationStrategy类中开始,该类附在下面:

    public class CsvGenerationStrategy : IReportGenerationStrategy
    {
        public async Task<Report> GenerateReportAsync(ICollection<ShipmentEntity> shipmentEntities)
        {
            var shipment = shipmentEntities
                .Select(s => (Shipment) s)
                .ToList();

            await using var memoryStream = new MemoryStream();
            await using var streamWriter = new StreamWriter(memoryStream);
            await using var csvWriter = new CsvWriter(streamWriter, CultureInfo.InvariantCulture);
            
            csvWriter.Configuration.Delimiter = ";";
            
            await csvWriter.WriteRecordsAsync(shipment);
            var content = memoryStream.ToArray();

            var report = new Report
            {
                Content = content,
                Type = ReportConstants.CsvFileType,
                Name = ReportConstants.CsvReportFileName
            };

            return report;
        }

        private class Shipment
        {
            [Name(ReportConstants.IssueColumnName)]
            public string Issue { get; set; }
            [Name(ReportConstants.MaterialReleaseReceiptColumnName)]
            public string MaterialReleaseReceipt { get; set; }
            [Name(ReportConstants.FreightBillIssueColumnName)]
            public string FreightBillIssue { get; set; }
            [Name(ReportConstants.InvoiceNumberColumnName)]
            public string InvoiceNumber { get; set; }
            [Name(ReportConstants.TaxCodeColumnName)]
            public string TaxCode { get; set; }
            [Name(ReportConstants.ContractorIdColumnName)]
            public string ContractorId { get; set; }
            [Name(ReportConstants.AddressIdColumnName)]
            public string AddressId { get; set; }
            [Name(ReportConstants.ContractorNameColumnName)]
            public string ContractorName { get; set; }
            [Name(ReportConstants.ShipmentCountryColumnName)]
            public string ShipmentCountry { get; set; }

            public static explicit operator Shipment(ShipmentEntity entity) =>
                entity != null
                    ? new Shipment
                        {
                            Issue = entity.Issue,
                            MaterialReleaseReceipt = entity.MaterialReleaseReceipt,
                            FreightBillIssue = entity.FreightBillIssue,
                            InvoiceNumber = entity.InvoiceNumber,
                            TaxCode = entity.TaxCode,
                            ContractorId = entity.ContractorId,
                            AddressId = entity.AddressId,
                            ContractorName = entity.ContractorName,
                            ShipmentCountry = entity.ShipmentCountry
                        }
                    : null;
        }
    }

代码看起来正确,但是类的行为却很奇怪。在大多数情况下,生成运行正常,但是很少有几次我注意到一种情况,即即使装运收集正确,MemoryStream对象也不包含任何数据。我相信,这种行为并不取决于作为参数传递的数据。可能我在播放流中出错了。如何正确使用它们?如何使用CsvHelper库正确生成csv文件?