【问题标题】:Unable to show pdf file in browser using response object无法使用响应对象在浏览器中显示 pdf 文件
【发布时间】:2017-06-08 09:55:20
【问题描述】:

我使用 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 中的响应标头:

缓存控制:私有
传输编码:分块内容类型:
应用程序/pdf 服务器:Microsoft-IIS/10.0
内容处置:工作 订单号 ad_0003.pdf
X-AspNet 版本:4.0.30319 X-SourceFiles: =?UTF-8?B?RzpcRm1zMlRmc1xGTVNPZmZpY2UtVjEwNi1UcnVua1xGTVNQb3J0YWxcRGFzaGJvYXJkU2VydmljZS5zdmNcUHJpbnRhYmxlSm9iT3JkZXJEb2N1bWVudA==?= X-Powered-By: ASP.NET Access-Control-Allow-Origin: * Date: Thu, 08 Jun 格林威治标准时间 2017 年 09:48:00


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");

【问题讨论】:

    标签: c# asp.net wcf devexpress httpresponse


    【解决方案1】:

    变化:

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

    到:

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

    这有帮助吗?

    【讨论】:

    • 刚刚在 chrome 中工作,但 firefox 现在有不同的问题。
    • 我不明白那张图片是什么 - 你需要再解释一下。
    • 感谢您的帮助。请查看对我有用的答案。
    【解决方案2】:

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

    HttpResponse.AddHeader Method (String, String) - 将 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 的兼容性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-28
      • 1970-01-01
      • 2013-12-28
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      相关资源
      最近更新 更多