Сбой библиотеки EvoPDF на размещенном сайте Windows Azure
Библиотека преобразования EvoPDF HTML в PDF (http://www.evopdf.com/) утверждает, что она поддерживает платформу Windows Azure Cloud, однако я не могу заставить ее работать. Я получаю исключение:
[Exception: Could not get conversion result header. Data receive error. Could not receive data. Error code: 109]
EvoPdf.HtmlToPdf.ImgConverter.GetLayoutFromUrl(String url, ps& htmlParseInfo) +622
EvoPdf.HtmlToPdf.PdfConverter.ConvertAndGetPdfDocument(String url, String htmlString, String baseUrl, String internalLinksDocUrl, Boolean fromUrl) +9748
EvoPdf.HtmlToPdf.PdfConverter.ConvertAndSaveToStream(Stream outStream, String url, String htmlString, String baseUrl, String internalLinksDocUrl, Boolean fromUrl) +61
EvoPdf.HtmlToPdf.PdfConverter.SavePdfFromUrlToStream(String url, Stream outPdfStream) +20
Это похоже на сбой в тот момент, когда библиотека извлекает содержимое HTML через веб-запрос. Есть ли что-то в Azure, что предотвращает исходящие веб-запросы?
Библиотека развернута в виде двух библиотек DLL, собственной библиотеки DLL и управляемой сборки. Требуется ли какая-либо специальная конфигурация Azure для загрузки собственных библиотек DLL? (Библиотека поддерживает развертывание xcopy, у меня она работает таким же образом в других средах хостинга).
4 ответа
Из того, что я вижу, вам нужно использовать и веб-роль Azure, а не веб-сайт Azure. Сайты не поддерживают работу с полным доверием.
В EvoPdf есть пример проекта для Azure, который вы можете загрузить и который показывает, как настроить веб-роль с сайтом, который может запускать EvoPdf dll.
Включить файл.dat
Вы также скопировали / включили evointernal.dat на сайт? Это решило ошибку 109 для меня. Он должен находиться в той же папке, что и файл *.dll.
Фон: DLL + DAT файл
Библиотека EVO HTML в PDF состоит из трех файлов:
- evohtmltopdf.dll
- evohtmltopdf.xml
- evointernal.dat
Обратите внимание, что после обновления DLL также обновите evointernal.dat. В противном случае ошибка 109 повторяется.
Общая библиотека EVO HTML в PDF для.NET работает непосредственно в веб-ролях Azure, рабочей роли Azure и виртуальных машинах Azure.
Для веб-сайтов Azure вы можете использовать решение EVO HTML в PDF для веб-сайтов Azure. Пример кода, скопированный оттуда:
protected void convertToPdfButton_Click(object sender, EventArgs e)
{
// Get the server IP and port
String serverIP = textBoxServerIP.Text;
uint serverPort = uint.Parse(textBoxServerPort.Text);
// Create a HTML to PDF converter object with default settings
HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter(serverIP, serverPort);
// Set optional service password
if (textBoxServicePassword.Text.Length > 0)
htmlToPdfConverter.ServicePassword = textBoxServicePassword.Text;
// Set HTML Viewer width in pixels which is the equivalent in converter of the browser window width
htmlToPdfConverter.HtmlViewerWidth = int.Parse(htmlViewerWidthTextBox.Text);
// Set HTML viewer height in pixels to convert the top part of a HTML page
// Leave it not set to convert the entire HTML
if (htmlViewerHeightTextBox.Text.Length > 0)
htmlToPdfConverter.HtmlViewerHeight = int.Parse(htmlViewerHeightTextBox.Text);
// Set PDF page size which can be a predefined size like A4 or a custom size in points
// Leave it not set to have a default A4 PDF page
htmlToPdfConverter.PdfDocumentOptions.PdfPageSize = SelectedPdfPageSize();
// Set PDF page orientation to Portrait or Landscape
// Leave it not set to have a default Portrait orientation for PDF page
htmlToPdfConverter.PdfDocumentOptions.PdfPageOrientation = SelectedPdfPageOrientation();
// Set the maximum time in seconds to wait for HTML page to be loaded
// Leave it not set for a default 60 seconds maximum wait time
htmlToPdfConverter.NavigationTimeout = int.Parse(navigationTimeoutTextBox.Text);
// Set an adddional delay in seconds to wait for JavaScript or AJAX calls after page load completed
// Set this property to 0 if you don't need to wait for such asynchcronous operations to finish
if (conversionDelayTextBox.Text.Length > 0)
htmlToPdfConverter.ConversionDelay = int.Parse(conversionDelayTextBox.Text);
// The buffer to receive the generated PDF document
byte[] outPdfBuffer = null;
if (convertUrlRadioButton.Checked)
{
string url = urlTextBox.Text;
// Convert the HTML page given by an URL to a PDF document in a memory buffer
outPdfBuffer = htmlToPdfConverter.ConvertUrl(url);
}
else
{
string htmlString = htmlStringTextBox.Text;
string baseUrl = baseUrlTextBox.Text;
// Convert a HTML string with a base URL to a PDF document in a memory buffer
outPdfBuffer = htmlToPdfConverter.ConvertHtml(htmlString, baseUrl);
}
// Send the PDF as response to browser
// Set response content type
Response.AddHeader("Content-Type", "application/pdf");
// Instruct the browser to open the PDF file as an attachment or inline
Response.AddHeader("Content-Disposition", String.Format("{0}; filename=Getting_Started.pdf; size={1}",
openInlineCheckBox.Checked ? "inline" : "attachment", outPdfBuffer.Length.ToString()));
// Write the PDF document buffer to HTTP response
Response.BinaryWrite(outPdfBuffer);
// End the HTTP response and stop the current page processing
Response.End();
}
Если проблема связана с вашей собственной DLL, вы можете попробовать изменить следующие атрибуты в ServiceDefinition.csdef:
- enableNativeCodeExecution: убедитесь, что для него установлено значение true (по умолчанию используется значение true)
- executeContext: попробуйте изменить это на повышенные
И вы развернули 64-битную версию DLL?
Я также вижу "Код ошибки: 109" в сообщении об ошибке, вы не можете связаться с EvoPDF, чтобы спросить, что это значит?
Обновление: если вы работаете в ASP.NET, вы можете попробовать изменить уровень доверия?
<configuration>
<system.web>
<trust level="Full" />
</system.web>
</configuration>