C#MemoryStream - 此流不支持超时[重复]

问题描述 投票:-2回答:1

这个问题在这里已有答案:

我正在尝试动态创建一个csv文件并将流输出到浏览器。

这是我的api终点:

    [System.Web.Http.HttpGet]
    [System.Web.Http.Route("export-to-csv")]
    public FileStreamResult ExportDeposits([FromUri(Name = "")]DepositSearchParamsVM depositSearchParamsVM)
        {
            if (depositSearchParamsVM == null)
            {
                depositSearchParamsVM = new DepositSearchParamsVM();
            }
            var records = _DepositsService.SearchDeposits(depositSearchParamsVM);
            var result = _DepositsService.WriteCsvToMemory(records);
            var memoryStream = new MemoryStream(result);

            return new FileStreamResult(memoryStream, "text/csv") { FileDownloadName = "export.csv" };
    }

这是我的服务方法:

public byte[] WriteCsvToMemory(IEnumerable<DepositSummaryVM> records)
        {
            using (var stream = new MemoryStream())
            using (var reader = new StreamReader(stream))
            using (var writer = new StreamWriter(stream))
            using (var csv = new CsvWriter(writer))
            {
                csv.WriteRecords(records);
                writer.Flush();
                stream.Position = 0;
                var text = reader.ReadToEnd();

                return stream.ToArray();

}

    }

这是错误消息:

{“message”:“发生了错误。”,“exceptionMessage”:“从'System.IO.MemoryStream''的'ReadTimeout'获取值时出错。”, “exceptionType”:“Newtonsoft.Json.JsonSerializationException”, “stackTrace”:“Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)\ r \ n在Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter writer,Object value,JsonContainerContract contract,JsonProperty member,JsonProperty property,JsonContract&在Newtonsoft.Json.Serialization.JsonSerializerInternalWriter的Ne​​wtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer,Object value,JsonObjectContract contract,JsonProperty member,JsonContainerContract collectionContract,JsonProperty containerProperty)\ r \ n中的memberContract,Object&memberValue)\ r \ n .SerializeValue(JsonWriter writer,Object value,JsonContract valueContract,JsonProperty成员,JsonContainerContract containerContract,JsonProperty containerProperty)\ r \ n在Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer,Object value,JsonObjectContract contract,JsonProperty member,JsonContainerCon) tract collectionContract,JsonProperty containerProperty)\ r \ n在Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer,Object value,JsonContract valueContract,JsonProperty成员,JsonContainerContract containerContract,JsonProperty containerProperty)\ r \ n在Newtonsoft.Json.Serialization。 JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter,Object value,Type objectType)\ r \ n在Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter,Object value,Type objectType)\ r \ n在System.Net.Http.Formatting.BaseJsonMediaTypeFormatter。 WriteToStream(Type type,Object value,Stream writeStream,Encoding effectiveEncoding)\ r \ n在System.Net.Http.Formatting.JsonMediaTypeFormatter.WriteToStream(Type type,Object value,Stream writeStream,Encoding effectiveEncoding)\ r \ n在System。 System.Net.Http.Formatting中的Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream(Type type,Object value,Stream writeStream,HttpContent content)\ r \ n .BaseJsonMediaTypeFormatter.WriteToStreamAsync(Type type,Object value,Stream writeStream,HttpContent content,TransportContext transportContext,CancellationToken cancellationToken)\ r \ n ---从抛出异常的上一个位置开始的堆栈跟踪结束--- \ r \ n在系统中System.Web.Http.Ott.HttpMessageHandlerAdapter.d__13.MoveNext()上的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\ r \ n的.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)\ r \ n “,”innerException“:{”message“:”发生错误。“,”exceptionMessage“:”此流不支持超时。“,”exceptionType“:”System.InvalidOperationException“,”stackTrace“:”at System.IO.Stream.get_ReadTimeout()\ r \ n在GetReadTimeout(Object)\ r \ n在Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)“}}

c# csv memorystream csvhelper
1个回答
0
投票

Api试图将MemoryStream序列化为json。所以,你会尝试改变ContentType;

    [System.Web.Http.HttpGet]
    [System.Web.Http.Route("export-to-csv")]
    public FileStreamResult ExportDeposits([FromUri(Name = "")]DepositSearchParamsVM depositSearchParamsVM)
    {
        if (depositSearchParamsVM == null)
        {
            depositSearchParamsVM = new DepositSearchParamsVM();
        }
        var records = _DepositsService.SearchDeposits(depositSearchParamsVM);
        var result = _DepositsService.WriteCsvToMemory(records);
        var memoryStream = new MemoryStream(result);
        Response.ContentType = new MediaTypeHeaderValue("application/octet-stream").ToString();// Content type
        return new FileStreamResult(memoryStream, "text/csv") { FileDownloadName = "export.csv" };
    }
© www.soinside.com 2019 - 2024. All rights reserved.