代码之家  ›  专栏  ›  技术社区  ›  bilpor

PostingAsJsonAsync在从调用的方法返回时给出500错误

c#
  •  1
  • bilpor  · 技术社区  · 11 月前

    我打以下电话:

    var response = await Http.PostAsJsonAsync<List<CreateBookingPoLinesViewModel>>("api/downloadCsv", CreateBookingPoLinesViewModel);
    

    这是我的方法:

     [HttpPost]
     public async Task<FileStreamResult> Post([FromBody] List<CreateBookingPoLinesViewModel> value)
     {
         try
         {
             MemoryStream ms = new MemoryStream();
             var writer = new StreamWriter(ms);
    
             var csv = new CsvWriter(writer, CultureInfo.InvariantCulture);
            
             foreach (var line in value.Select(x => x.pOLineDTO))
             {
                 csv.WriteRecord(line);
                 csv.Flush();
             }
            
           
             FileStreamResult result = new FileStreamResult(ms, "text/csv")
             {
                 FileDownloadName = string.Format("PoLines-{0}.csv", value.First().pOLineDTO.PurchaseOrderId)
             };
            
             return result;
         }
         catch (Exception ex)
         {
    
             throw;
         }
        
     }
    

    我对post方法的调用也在try/catch块中,并且两个catch块都没有被命中。我的post方法运行到 return result 行,我的代码已经通过 foreach 并且似乎在写记录。

    当我的代码返回时当我查看响应时,它有内部服务器错误500。

    有人知道我的帖子方法出了什么问题吗?

    1 回复  |  直到 11 月前
        1
  •  1
  •   dbc    11 月前

    你需要倒带 MemoryStream 通过设置 ms.Position = 0 然后再返回。我还建议关闭 StreamWriter CsvWriter 以确保所有缓冲区都被刷新:

    var ms = new MemoryStream();
    
    using (var writer = new StreamWriter(ms, leaveOpen : true)) // Leave the MemoryStream open after disposing of the writers
    using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
        foreach (var line in value.Select(x => x.pOLineDTO))
            csv.WriteRecord(line);
    
    // Rewind the MemoryStream
    ms.Position = 0;
    
    var result = new FileStreamResult(ms, "text/csv")
    {
        FileDownloadName = string.Format("PoLines-{0}.csv", value.FirstOrDefault()?.pOLineDTO?.PurchaseOrderId)
    };
    
    return result;