Встроенная проблема Microsoft Edge PDF Та же проблема снова

У меня по-прежнему возникает та же проблема, о которой ранее сообщалось и на которую был дан ответ в разделе встроенная проблема Microsoft Edge PDF хотя я использую не предварительную версию Win 10, а последнюю, загруженную через Центр обновления Windows.

После обновления моей машины с Win 8.1 до Win 10 и тестирования моего приложения ASP.NET я столкнулся с проблемой отображения встроенных файлов PDF.

Вот мой код С# в моем приложении 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-файл.

Что я делаю не так?


person loowool    schedule 06.08.2015    source источник
comment
Обратите внимание, что замена встроенного на вложение работает, появляется запрос на сохранение файла, и загрузка файла работает нормально. Нам нужно, чтобы он загружался в окне браузера.   -  person loowool    schedule 10.08.2015
comment
У меня такая же проблема с IE Edge 20.10240.16384.0 на Win 10!   -  person powtac    schedule 08.03.2016


Ответы (4)


Скопировано из моего обходного пути на Microsoft Connect.

ВНИМАНИЕ! Это полный взлом, и существует риск взлома, если/когда Microsoft исправит эту проблему.

Вы увидите, что Edge выдает два запроса каждый раз, когда вы просматриваете PDF-файл. Мне кажется, что браузер отправляет первоначальный запрос, а затем средство просмотра 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. Будем надеяться, что Microsoft исправит эту проблему в своем браузере, и этот обходной путь не понадобится.

person Dark Helmet    schedule 13.08.2015
comment
Я могу подтвердить, что я также вижу это GetContentFeatures.DLNA.ORG во втором запросе. - person powtac; 08.03.2016
comment
В Edge 38.14393.0.0 второго запроса, по-видимому, нет, однако инструменты разработчика сообщают, что этот ресурс не имеет данных полезной нагрузки ответа для рассматриваемого запроса, хотя я точно знаю, что они есть, потому что тот же процесс работает в Chrome. - person Dave Nottage; 30.01.2017

Спасибо, Темный Шлем, ты спас меня. Я реализовал решение в 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;
    }
}
person Ansar    schedule 09.03.2016

Спасибо, ребята, я просто хочу разместить здесь свое решение 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()
person Matt Roy    schedule 09.06.2017

В Edge 16.16299 (Windows Fall Creator Update) здесь были внесены изменения. Мы сделали обходной путь, описанный в этом выпуске, и он сработал «хорошо». Но теперь с новой версией Edge (16.16299) он больше не работает, и бывает, что PDF-файлы повреждены (размером 0 байт). Будьте осторожны, если вы где-то реализовали этот обходной путь. Вы также позаботитесь о том, чтобы Edge выполнял два запроса, как и раньше.

person Stofa    schedule 03.11.2017