c# - Web API HttpResponseMessage 内容返回不完整

标签 c# asp.net-web-api httpresponse

我想返回一个使用 Web API 5.0 从我的数据库生成的 csv 它工作正常,只是返回的 csv 被截断了。

我假设问题出在 MemoryBuffer 管理上,但我找不到它在哪里。

我的代码(已解决):

        IEnumerable<MasterObsTrip> masterTripList = _obsvMasterRepo.GetObsTrips(vesselName, dateYear, port, obsvCode, obsvTripCode, obsvProgCode, lastModifiedDateYear, lastModifiedBy, statusCode);
        IList<MasterObsTripModel> masterTripModelList = new List<MasterObsTripModel>();
        foreach (MasterObsTrip trip in masterTripList)
            masterTripModelList.Add(new MasterObsTripModel(trip));

        var stream = new MemoryStream();
        var writer = new StreamWriter(stream);

        CsvFileDescription outputFileDescription = new CsvFileDescription
        {
            SeparatorChar = ',', // comma delimited
            FirstLineHasColumnNames = true, // no column names in first record
            FileCultureName = "nl-NL" // use formats used in The Netherlands
        };
        CsvContext cc = new CsvContext();
        cc.Write(masterTripModelList,writer,outputFileDescription);
        writer.Flush();
        stream.Position = 0;
        HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
        response.Content = new StreamContent(stream);
        response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
        response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
        response.Content.Headers.ContentDisposition.FileName = "ObserverTripList.csv";
        stream.Flush();
        return response;

谢谢

最佳答案

我会尝试在您重置 stream.Position = 0 之前执行 writer.Flush()

此外,如果您经常需要 CSV 内容,我还建议您自己创建一个 CsvContent 类。

public class CsvContent<T> : HttpContent
    {
        private readonly MemoryStream _stream = new MemoryStream();
        public CsvContent(CsvFileDescription outputFileDescription, string filename, IEnumerable<T> data)
        {
            var cc = new CsvContext();
            var writer = new StreamWriter(_stream);
            cc.Write(data, writer, outputFileDescription);
            writer.Flush();
            _stream.Position = 0;

            Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
            Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
            Headers.ContentDisposition.FileName = filename;

        }
        protected override Task SerializeToStreamAsync(Stream stream, TransportContext context)
        {
            return _stream.CopyToAsync(stream);
        }

        protected override bool TryComputeLength(out long length)
        {
            length = _stream.Length;
            return true;
        }
    }

然后你的 Controller Action 减少到...

IEnumerable<MasterObsTrip> masterTripList = _obsvMasterRepo.GetObsTrips(vesselName, dateYear, port, obsvCode, obsvTripCode, obsvProgCode, lastModifiedDateYear, lastModifiedBy, statusCode);
        IList<MasterObsTripModel> masterTripModelList = new List<MasterObsTripModel>();
        foreach (MasterObsTrip trip in masterTripList)
            masterTripModelList.Add(new MasterObsTripModel(trip));

        CsvFileDescription outputFileDescription = new CsvFileDescription
        {
            SeparatorChar = ',', // comma delimited
            FirstLineHasColumnNames = true, // no column names in first record
            FileCultureName = "nl-NL" // use formats used in The Netherlands
        };
        HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK) {
           Content = new CsvContent<MasterObsTripModel> (outputFileDescription, 
                                                      "ObserverTripList.csv", 
                                                       masterTripModelList);
        }
        return response;

这可以通过在 CsvContent 类中创建 CsvFileDescription 来进一步简化。

关于c# - Web API HttpResponseMessage 内容返回不完整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19965792/

相关文章:

c# - 用户安装和运行基于 .NET 3.5 的 ClickOnce 应用程序所需的最低权限是什么?

c# - 委托(delegate)中的方法参数

c# - 如何在 ASP.NET Web API 核心中全局启用 CORS

c# - 发出 jQuery Ajax 请求时授权 header 为空

php - 网站什么时候向推荐人发回 200 OK?

java - 响应 sendRedirect() 处理

javascript - 如何从响应中读取文件名-reactJs

c# - 处理 C# WebService 异常

c# - 在 JsonConverter 中递归调用 JsonSerializer

c# - 我的 WebApi 在 Visual Studio 上工作正常但在 IIS 上不工作