我使用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");
答案 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的兼容性。