"Microsoft Edge PDF встроенная проблема" та же проблема снова
У меня все еще остается та же проблема, о которой ранее сообщалось и на которую было дано ответ в рамках встроенной проблемы Microsoft Edge PDF, хотя я не использую предварительную версию Win 10, но последнюю версию, загруженную через Центр обновления Windows.
После обновления моей Win 8.1 Machine до Win 10 и тестирования моего приложения ASP.NET я столкнулся с проблемой отображения встроенных pdf-файлов.
Вот мой код C# в моем приложении ASP.NET:
Response.Clear();
Response.ClearHeaders();
Response.ClearContent();
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition","inline;filename=some.pdf");
Response.BinaryWrite(pdfArray);
Response.End();
Вышеуказанное работает во всех браузерах, кроме Edge, где выдает следующую ошибку:
Не удалось открыть PDF Что-то препятствует открытию этого PDF.
Что я делаю неправильно?
4 ответа
Скопировано из моего обходного пути на Microsoft Connect.
ВНИМАНИЕ: Это полный взлом, и существует риск взлома, если / когда Microsoft когда-либо исправит эту проблему.
Вы увидите, что Edge выдает два запроса каждый раз, когда просматриваете PDF. Мне кажется, что браузер отправляет первоначальный запрос, а затем программа просмотра PDF отправляет свой собственный запрос при его открытии. Если вы посмотрите на заголовки в этом втором запросе, вы увидите, что выходит странный заголовок DLNA, который должен быть только для потоковой передачи мультимедиа, но это приводит меня к моему решению...
Когда запрос получен в вашем обработчике или на странице, проверьте, содержит ли строка агента пользователя "Edge/12". Если это не так, отправьте свой PDF обратно в обычном режиме. Если это так, перейдите к шагу № 2.
Проверьте, существует ли заголовок HTTP "GetContentFeatures.DLNA.ORG". Если это не так, это означает, что запрос пришел из браузера. Просто отправьте обратно заголовок Content-Type "application/pdf" и пустое тело. Если заголовок существует, то запрос поступил из средства просмотра PDF, и вы можете отправить свой PDF обратно в обычном режиме.
По сути, обработчик обрабатывает этот первый запрос как запрос HEAD, а затем отвечает полным PDF, если мы определим, что запрос поступает из средства просмотра PDF. Здесь мы рискуем, если Microsoft удалит этот заголовок DLNA позже, Edge не будет правильно отображать PDF. Надеемся, что Microsoft исправит эту проблему в своем браузере, и этот обходной путь не понадобится.
Спасибо Темный Шлем, ты спас мой день. Я реализовал решение в 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;
}
}
Спасибо, ребята, я просто хочу разместить здесь свое решение 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()
С Edge 16.16299 (Windows Fall Creator Update) здесь были сделаны изменения. Мы сделали обходной путь, описанный в этом выпуске, и он работал "хорошо". Но теперь с новой версией Edge (16.16299) она больше не работает, и случается, что файлы PDF повреждены (размер 0 байт). Будьте осторожны, если вы где-нибудь внедрили этот обходной путь. Вы также позаботитесь о том, чтобы Edge делал два запроса, как раньше.