C# MemoryStream - 此流不支持超时

Jim*_*ely 8 c# csv memorystream csvhelper

我正在尝试动态创建 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" };
    }
Run Code Online (Sandbox Code Playgroud)

这是我的服务方法:

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();
Run Code Online (Sandbox Code Playgroud)

}

    }
Run Code Online (Sandbox Code Playgroud)

这是错误消息:

{ "message": "发生错误。", "exceptionMessage": "从 'System.IO.MemoryStream' 上的 'ReadTimeout' 获取值时出错。",
exceptionType”:“Newtonsoft.Json.JsonSerializationException”,
"stackTrace": " 在 Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(对象目标)\r\n 在 Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter writer、对象值、JsonContainerContract 合约、JsonProperty 成员、JsonProperty 属性、JsonContract& memberContract、Object& memberValue)\r\n 在 Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer、对象值、JsonObjectContract 契约、JsonProperty 成员、JsonContainerContract collectionContract、JsonProperty containerProperty)\r\n 在 Newtonsoft.Json.Serialization.JsonSerializerInternalWriter .SerializeValue(JsonWriter writer, 对象值, JsonContract valueContract, JsonProperty 成员, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n 在 Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, 对象值, JsonObjectContract 契约, JsonProperty 成员, JsonContainerContract collectionContract 、 JsonProperty containerProperty)\r\n 在 Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer、对象值、JsonContract valueContract、JsonProperty 成员、JsonContainerContract containerContract、JsonProperty containerProperty)\r\n 在 Newtonsoft.Json.Serialization.JsonSerializerInternalWriter。序列化(JsonWriter jsonWriter,对象值,类型 objectType)\r\n 在 Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter,对象值,类型 objectType)\r\n 在 System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream(类型类型、对象值、流 writeStream、编码 effectiveEncoding)\r\n 在 System.Net.Http.Formatting.JsonMediaTypeFormatter.WriteToStream(类型类型、对象值、流 writeStream、编码 effectiveEncoding)\r\n 在 System.Net。 Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream(类型类型,对象值,流 writeStream,HttpContent 内容)\r\n 在 System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStreamAsync(类型类型,对象值,流 writeStream,HttpContent 内容,TransportContext TransportContext、CancellationToken CancelToken)\r\n--- 从先前引发异常的位置开始的堆栈跟踪结束 ---\r\n 位于 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n 位于 System .Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n 在 System.Web.Http.Owin.HttpMessageHandlerAdapter.d__13.MoveNext()", "innerException": { "message": "发生错误。" , "exceptionMessage": "此流不支持超时。", "exceptionType": "System.InvalidOperationException", "stackTrace": " 在 System.IO.Stream 处。get_ReadTimeout()\r\n 在 GetReadTimeout(Object )\r\n 在 Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)" } }

luc*_*cky 6

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" };
    }
Run Code Online (Sandbox Code Playgroud)