从控制器返回PDF以查看时出现ReadTimeOut异常

时间:2018-10-07 10:38:07

标签: c# json asp.net-mvc itext

当用户单击“打印”按钮时,我想下载pdf。

我的控制器方法:

[System.Web.Http.HttpGet]
        public FileStreamResult CreatePDF()
        {
            MemoryStream workStream = new MemoryStream();
            Document document = new Document();
            PdfWriter.GetInstance(document, workStream).CloseStream = false;

            document.Open();
            document.Add(new Paragraph("Hello World"));
            document.Add(new Paragraph(DateTime.Now.ToString()));
            document.Close();

            byte[] byteInfo = workStream.ToArray();
            workStream.Write(byteInfo, 0, byteInfo.Length);
            workStream.Position = 0;

            return new FileStreamResult(workStream, "application/pdf");
        }

这是我从视图中调用它的方式:

 $('#print').click(function (evt) {
                window.location.href = "/api/pdfdownload/createpdf";
            });

单击打印按钮时出现以下错误:

  

'ObjectContent`1'类型无法序列化   内容类型为'application / json的响应主体; charset = utf-8'。      System.InvalidOperationException     有一个错误   发生。获取价值时出错   'System.IO.MemoryStream'上的'ReadTimeout'。   Newtonsoft.Json.JsonSerializationException    在   Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(对象   目标)   Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter   作者,对象值,JsonContainer合同,JsonProperty   成员,JsonProperty属性,JsonContract&memberContract,Object&   memberValue)   Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter   作者,对象值,JsonObjectContract合同,JsonProperty   JsonContainerContract collection成员,JsonProperty   containerProperty)   Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter   writer,对象值,JsonContract valueContract,JsonProperty成员,   JsonContainerContract containerContract,JsonProperty   containerProperty)   Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter   作者,对象值,JsonObjectContract合同,JsonProperty   JsonContainerContract collection成员,JsonProperty   containerProperty)   Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter   writer,对象值,JsonContract valueContract,JsonProperty成员,   JsonContainerContract containerContract,JsonProperty   containerProperty)   Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter   jsonWriter,对象值,类型objectType)位于   Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter   jsonWriter,对象值,类型objectType)位于   System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream(Type   类型,对象值,流writeStream,编码有效编码)   System.Net.Http.Formatting.JsonMediaTypeFormatter.WriteToStream(Type   类型,对象值,流writeStream,编码有效编码)   System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream(Type   类型,对象值,流writeStream,HttpContent内容)   System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStreamAsync(Type   类型,对象值,流writeStream,HttpContent内容,   TransportContext transportContext,CancellationToken   cancelToken)---从先前位置开始的堆栈结束跟踪   引发了异常---   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)   System.Web.Http.WebHost.HttpControllerHandler.d__1b.MoveNext()     有一个错误   发生。不支持超时   此流。   System.InvalidOperationException    在System.IO.Stream.get_ReadTimeout()在   GetReadTimeout(Object)位于   Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(对象   目标)

在这种情况下,我只是不理解此异常的含义。将感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这意味着它无法将MemoryStream类型的对象序列化为JSON:

  

“ ObjectContent`1”类型无法序列化响应正文   内容类型“ application / json; charset = utf-8'。   System.InvalidOperationException发生错误。获取错误   “ System.IO.MemoryStream”上“ ReadTimeout”的值。   Newtonsoft.Json.JsonSerializationException ...

我的猜测是,您正在尝试(可能有意而非有意)将MemoryStream序列化为JSON,这在您处理PDF文件时并非偶然,但您不能这样做。 MemoryStream包含字节,并且不能序列化为JSON。

我建议您从asp.net论坛上浏览此post,但没有更多信息,仅此而已。