В нашем приложении мы создаем буклет с рекомендациями для пользователей веб-приложения. Это довольно здоровенные документы, на создание которых уходит до 30 секунд. Мы решили, что лучший способ для этого - создать PDF-файл в фоновом режиме приложения до того, как пользователь его запросит.
Если пользователь запрашивает PDF, открывается страница, которая проверяет, завершен ли буклет и отображается ли он пользователю.
Это прекрасно работает во всех случаях, если Adobe не установлен на «Отображать PDF в браузере» и пользователь не использует IE8 или IE7.
В этом случае мы получаем предупреждение о загружаемом файле, и этот файл отображается в виде двоичного текста.
Мы извлекаем файл pdf, когда приложение запускает вызов ajax, который генерирует содержимое, используя следующий код.
Зацикливаться, пока буклет не будет готов.
If pdfState = PdfBooklet.Status.Complete Then
If Me.SupportsScript Then
' Send signal back to Ajax call saying we're ready
Response.ClearContent()
Response.Write("complete")
Response.End()
Else
' Non-JS can just have it delivered straight away
pdf = CType(HttpContext.Current.Session(PdfBooklet.sSessionBookletKey), Byte())
ServerPDFBooklet(pdf)
End If
Else
' Not finished yet
Response.ClearContent()
If Me.SupportsScript Then
If isAjaxRequest Then
' Signal back to Ajax to wait a bit long
Response.Write("waiting")
Response.End()
End If
Else
' Non-JS => page refresh
Response.AddHeader("refresh", "3")
End If
End If
И написать в pdf
With Response
.Clear()
.ClearHeaders()
.AddHeader("Content-Disposition", "inline; filename=" & pdfFilename & ".pdf")
.ContentType = "application/pdf"
Try
.BinaryWrite(binaryPDF)
.Flush()
.End()
Catch Ex As HttpException When Ex.ErrorCode = &H80072746
'Client disconnected
End Try
End With
Самый простой способ для нас это исправить - просто откликнуться. Переадресация на новую страницу для обслуживания буклета после его завершения, но мы бы предпочли этого не делать.
Есть идеи ...?