无法使用响应对象在浏览器中显示pdf文件

时间:2017-06-08 09:55:21

标签: c# asp.net wcf devexpress httpresponse

我使用Dev Express生成的pdf文件,并使用响应对象将其返回给浏览器。我需要在浏览器新窗口中打开文件。

对于客户端脚本,调用Web服务方法的代码:

window.open(dashboardService + "PrintableJobOrderDocument?JobOrderNo=" + jobOrderNo, "Job Order Documnet", "scrollbars=0,fullscreen=1", false);

对于WCF服务,方法是:

[OperationContract]
[WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json)]
public void PrintableJobOrderDocument(string JobOrderNo)
{
    if (!string.IsNullOrEmpty(JobOrderNo))
    {
        CommonServiceClient commonService = null;
        try
        {
            commonService = new CommonServiceClient();
            var data = commonService.JobOrderPDFDoc(JobOrderNo);
            if (data.Count() != 0)
            {
                //Excel file as a memory stream
                var excel = JobOrderTemplate(data);//this method will return the workbook object.
                MemoryStream ExcelStream = new MemoryStream();
                excel.SaveDocument(ExcelStream, DocumentFormat.Xlsx);
                ExcelStream.Position = 0;

                //Excel file to a pdf memory stream
                Workbook workbook = new Workbook();
                workbook.LoadDocument(ExcelStream, DocumentFormat.Xlsx);
                MemoryStream PDFStream = new MemoryStream();
                workbook.ExportToPdf(PDFStream);
                PDFStream.Seek(0, SeekOrigin.Begin);

                HttpResponse response = HttpContext.Current.Response;
                response.Clear();
                response.BufferOutput = true;
                response.ContentType = "application/pdf";
                response.AppendHeader("content-disposition", "Job Order No. " + JobOrderNo + ".pdf");
                byte[] fileToDownload = PDFStream.ToArray();
                response.BinaryWrite(fileToDownload);
                response.Flush();
                response.End();
            }
        }
        catch (Exception ex)
        {
            GeneralTask.AddMessageLog(MessageLogApplication.Portal, MessageLogModules.Common, MessageLogType.Error, MethodBase.GetCurrentMethod().Name, ex);
        }
        finally
        {
            ServiceHelper.CloseService(commonService);
        }
    }
}

响应对象向不同的浏览器显示不同的行为。 像:
Chrome:文件打开一段时间,有时无法打开文件。
Mozilla:文件永远不会打开并给我错误:

  

C:\ Users \ tach \ AppData \ Local \ Temp \ nJ0oODH4.pdf.part无法保存,   因为无法读取源文件。

     

稍后再试,或与服务器管理员联系。


Mozilla的响应标头:

  

缓存控制:私有   
  Transfer-Encoding:chunked Content-Type:   
  application / pdf Server:Microsoft-IIS / 10.0   
  内容处理:工作   订单号ad_0003.pdf   
  X-AspNet-Version:4.0.30319 X-SourceFiles:   =?UTF-8 2 B 4 RzpcRm1zMlRmc1xGTVNPZmZpY2UtVjEwNi1UcnVua1xGTVNQb3J0YWxcRGFzaGJvYXJkU2VydmljZS5zdmNcUHJpbnRhYmxlSm9iT3JkZXJEb2N1bWVudA ==?=   X-Powered-By:ASP.NET Access-Control-Allow-Origin:*日期:星期四,8月8日   2017 09:48:00 GMT


Microsoft Edge:文件永远不会打开。


我已检查所有浏览器网络选项卡和标题响应文件,文件类型,文件名可用但无法打开文件。

更新

以下 AppHeader 适用于 Chrome ,但适用于Firefox或Edge。

response.AppendHeader("content-disposition", "inline; \"Job Order No " + JobOrderNo + ".pdf\"");

response.AppendHeader("content-disposition", "Job Order No. " + JobOrderNo + ".pdf");

2 个答案:

答案 0 :(得分:1)

变化:

response.AppendHeader("content-disposition", "Job Order No. " + JobOrderNo + ".pdf");

为:

response.AppendHeader("Content-Disposition", "inline; \"Job Order No " + JobOrderNo + ".pdf\"");

这有帮助吗?

答案 1 :(得分:1)

为了支持所有浏览器,我只是将我的代码更改为查看文件以下载文件,而不是使用AppendHeader,我使用AddHeader来设置响应标头属性。根据 MSDN

  

HttpResponse.AddHeader方法(字符串,字符串) - 将HTTP标头添加到输出流。提供了 AddHeader   与早期版本的ASP 的兼容性。

HttpResponse response = HttpContext.Current.Response;
response.Clear();
response.ClearHeaders();
response.AddHeader("Content-Disposition", "attachment;filename=" + "Job Order No " + JobOrderNo + ".pdf");
response.AddHeader("Content-Length", PDFStream.Length.ToString());
response.ContentType = "application/pdf";
response.Flush();
response.BinaryWrite(PDFStream.ToArray());
response.End();

我认为这解决了我的问题,因为它提供了与早期版本的ASP的兼容性。