"Microsoft Edge PDF内置问题" 再次遇到同样的问题

10

虽然我没有使用Win 10的预发布版本,而是最新通过Windows更新下载的最新版本,但我仍然遇到了之前在Microsoft Edge PDF inline issue下报告和回答的相同问题。

在将我的Win 8.1机器升级到Win 10并测试我的ASP.NET应用程序后,我遇到了显示内联pdf文件的问题。

以下是我ASP.NET应用程序中的C#代码:

Response.Clear();
Response.ClearHeaders(); 
Response.ClearContent();
Response.ContentType = "application/pdf"; 
Response.AddHeader("content-disposition","inline;filename=some.pdf");
Response.BinaryWrite(pdfArray); 
Response.End();

除了Edge浏览器外,以上代码在所有浏览器上都有效。在Edge浏览器上会出现以下错误:

无法打开PDF文件 有些东西阻止了PDF文件的打开。

我做错了什么?


请注意,将内联替换为附件可以解决问题,它会弹出保存文件提示,下载文件也能正常工作。但我们需要在浏览器窗口中加载它。 - loowool
我在Win 10上使用IE Edge 20.10240.16384.0也遇到了同样的问题! - powtac
4个回答

12

本文是我在Microsoft Connect上的临时解决方案。

警告:这是一种完全的 hack 方法,如果微软修复此问题,则有可能导致破坏性问题。

你会发现每当你查看 PDF 文件时,Edge 会发送两个请求。在我看来,浏览器会发送初始请求,然后 PDF 查看器在打开时会发出自己的请求。如果你查看第二个请求中的标头,你会发现一个奇怪的 DLNA 标头,它应该仅用于媒体流传输,但这引导了我的解决方案...

  1. 当你的处理程序或页面接收到请求时,检查用户代理字符串是否包含 "Edge/12."。如果不包含,则正常发送 PDF。如果包含,则继续执行步骤 #2。

  2. 检查 HTTP 标头 "GetContentFeatures.DLNA.ORG" 是否存在。如果不存在,则表示请求来自浏览器。只需返回一个 Content-Type 标头为 "application/pdf" 和空主体即可。如果标头存在,则请求来自 PDF 查看器,你可以正常发送 PDF。

基本上,处理程序将第一个请求视为 HEAD 请求,如果我们确定请求来自 PDF 查看器,则用完整的 PDF 响应。我们面临的风险是,如果 Microsoft 以后删除了那个 DLNA 标头,Edge 将无法正确渲染 PDF。希望微软会在他们的浏览器中修复这个问题,这样就不需要这个解决方案了。


我可以确认在第二个请求中也看到了 GetContentFeatures.DLNA.ORG - powtac
在Edge 38.14393.0.0中,似乎没有第二个请求,但是开发人员工具报告称针对该请求的“此资源没有响应有效负载数据”,而我确定有响应数据,因为在Chrome中相同的过程可以正常工作。 - Dave Nottage

1

感谢Dark Helmet,你救了我一天。 我用Java实现了解决方案。以下是可能对其他人有帮助的代码。

String userAgent = request.getHeader("user-agent");
System.out.println(userAgent);
if(userAgent.contains("Edge")){
    String dlnaHeader = request.getHeader("getcontentfeatures.dlna.org");
    System.out.println(dlnaHeader);
    if(dlnaHeader == null ){
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] result = baos.toByteArray();
        response.setContentType("application/pdf");
        response.setHeader("Content-disposition","inline; ");
        response.setContentLength(result.length);               
        ServletOutputStream sos = response.getOutputStream();
        sos.write(result);
        return null;
    }
}

0
谢谢大家,我只是想在这里分享一下基于你们的解决方法的VB.NET解决方案。
Response.Clear()
Response.ClearHeaders()
Response.ClearContent()
Response.Buffer = True
If Request.Headers.Item("User-Agent").Contains("Edge") _
AndAlso IsNothing(Request.Headers.Item("GetContentFeatures.DLNA.ORG")) Then
    'Edge? Send empty output if special header not exist
    Response.ContentType = "application/pdf"
    Dim bTemp As Byte()
    Response.BinaryWrite(bTemp) 'Empty output
    Response.Flush()
    Response.SuppressContent = True
    HttpContext.Current.ApplicationInstance.CompleteRequest()
End If
'Normal process:
Response.ContentType = "application/pdf"
Response.BinaryWrite(pdfArray)
Response.Flush()
Response.SuppressContent = True
HttpContext.Current.ApplicationInstance.CompleteRequest()

0

随着Edge 16.16299(Windows Fall Creator Update)的推出,这里进行了一些更改。我们按照此问题中描述的解决方法进行了处理,并且它“有效”。但是现在,使用新版本的Edge(16.16299),它不再起作用,并且会发生PDF文件损坏(大小为0字节)的情况。如果您在某个地方实施了此解决方法,请注意。另外需要注意的是,Edge像以前一样执行两个请求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接