C# 在Azure中将Tuhkin与MVC项目一起使用
我无法让pechkin或tuespechkin在我的azure站点上工作 每当我尝试访问该站点时,它都会挂起,没有错误消息,即使customErrors处于关闭状态。我还缺少其他设置吗?一切都在本地完美运行 对于64位应用程序,我将完成以下步骤: 使用Azure创建一个新的空MVC应用程序,确保已选择云中的主机 将应用程序更改为64位 登录azure门户并将应用升级为基本托管,然后将其更改为64位 安装TuesPechkin.Wkhtmltox.Win64和TuesPechkin nuget软件包 添加一个singleton类以返回IConverterC# 在Azure中将Tuhkin与MVC项目一起使用,c#,.net,asp.net-mvc,azure,tuespechkin,C#,.net,Asp.net Mvc,Azure,Tuespechkin,我无法让pechkin或tuespechkin在我的azure站点上工作 每当我尝试访问该站点时,它都会挂起,没有错误消息,即使customErrors处于关闭状态。我还缺少其他设置吗?一切都在本地完美运行 对于64位应用程序,我将完成以下步骤: 使用Azure创建一个新的空MVC应用程序,确保已选择云中的主机 将应用程序更改为64位 登录azure门户并将应用升级为基本托管,然后将其更改为64位 安装TuesPechkin.Wkhtmltox.Win64和TuesPechkin nuget软件
public class TuesPechkinConverter
{
private static IConverter converter;
public static IConverter Converter
{
get
{
if (converter == null)
{
converter =
new ThreadSafeConverter(
new PdfToolset(
new Win64EmbeddedDeployment(
new TempFolderDeployment())));
}
return converter;
}
}
}
在索引操作中添加具有以下代码的主控制器:
var document = new HtmlToPdfDocument
{
GlobalSettings =
{
ProduceOutline = true,
DocumentTitle = "Pretty Websites",
PaperSize = PaperKind.A4, // Implicit conversion to PechkinPaperSize
Margins =
{
All = 1.375,
Unit = Unit.Centimeters
}
},
Objects =
{
new ObjectSettings { HtmlText = "<h1>Pretty Websites</h1><p>This might take a bit to convert!</p>" },
new ObjectSettings { PageUrl = "www.google.com" }
}
};
byte[] pdfBuf = TuesPechkinConverter.Converter.Convert(document);
return File(pdfBuf, "application/pdf", "DownloadName.pdf");
恐怕答案是不可能让wkhtmltopdf在Azure上工作 我想你的意思是在WindowsAzure网站上运行wkhtmltopdf wkhtmltopdf使用Windows的GDIAPI,但目前在Azure上不起作用 网站 它支持.NET 2.0+、32位和64位进程以及IIS托管的应用程序。 Azure网站目前不支持使用wkhtmltopdf。 变通办法
我最终创建了一个运行wkhtmltopdf.exe的Azure云服务。我将html发送到服务,并得到一个字节[] 据我所知,你不能让它在web应用程序中工作。然而,有一种方法可以做到这一点:您必须创建一个云服务并向其中添加一个工作者角色。TuesPechkin将以此工作角色安装 工作流程如下:从您的云web应用程序,您将访问工作角色通过将工作角色配置为宿主Asp.NET web API 2,这是可能的。工作者角色将使用TuesPechkin配置转换器并生成PDF。我们将把pdf封装在web api响应中并将其发送回。现在,让我们开始吧 若要添加云服务(假设已安装Azure SDK),请在单击“确定”后转到Visual Studio->右键单击解决方案->添加新项目->选择云节点->Azure云服务->选择工作角色并单击“确定” 将创建您的云服务和工作人员角色。下一步要做的是配置您的工作者角色,以便它可以承载ASP.NET Web API 2。 通过遵循教程,此配置非常简单 在将Worker角色配置为承载web api后,您必须安装TuesPechkin.Wkhtmltox.Win64和TuesPechkin nuget软件包 您的配置现在应该准备好了。现在创建一个控制器,我们将在其中生成PDF:add一个新类,该类将扩展ApicController: 向控制器添加一个操作,该操作将返回一个HttpResponseMessage对象 在这里,我们将配置两个ObjectSettings和GlobalSettings对象,它们将应用于HtmlToPdfDocument对象。 你现在有两个选择 您可以从html文本生成pdf,也可以在请求中发送页面的html,或者直接通过页面url发送
var document = new HtmlToPdfDocument
{
GlobalSettings =
{
ProduceOutline = true,
DocumentTitle = "Pretty Websites",
PaperSize = PaperKind.A4, // Implicit conversion to PechkinPaperSize
Margins =
{
All = 1.375,
Unit = Unit.Centimeters
}
},
Objects = {
new ObjectSettings { HtmlText = "<h1>Pretty Websites</h1><p>This might take a bit to convert!</p>" },
new ObjectSettings { PageUrl = "www.google.com" }
}
};
此外,根据TuesPechkin文档,转换器应该是线程安全的,并且应该保持在某个静态的位置,或者作为单例实例:
IConverter converter =
new ThreadSafeConverter(
new RemotingToolset<PdfToolset>(
new Win64EmbeddedDeployment(
new TempFolderDeployment())));
如果我误解了,很抱歉,但我不认为TuesPechkin按照github页面在Azure网站上实际工作。原因是该库使用的GDI在azure下不可用。啊,我发现现在-我可能需要使用第三方转换服务,然后:开始调查它,正如这里提到的,是否有其他快速且易于使用的替代方案可以在azure上转换HTML>PDF?
var document = new HtmlToPdfDocument
{
GlobalSettings =
{
ProduceOutline = true,
DocumentTitle = "Pretty Websites",
PaperSize = PaperKind.A4, // Implicit conversion to PechkinPaperSize
Margins =
{
All = 1.375,
Unit = Unit.Centimeters
}
},
Objects = {
new ObjectSettings { HtmlText = "<h1>Pretty Websites</h1><p>This might take a bit to convert!</p>" },
new ObjectSettings { PageUrl = "www.google.com" }
}
};
var obj = new ObjectSettings();
obj.LoadSettings.PostItems.Add
(
new PostItem()
{
Name = "paramName",
Value = paramValue
}
);
IConverter converter =
new ThreadSafeConverter(
new RemotingToolset<PdfToolset>(
new Win64EmbeddedDeployment(
new TempFolderDeployment())));
byte[] result = converter.Convert(document);
MemoryStream ms = new MemoryStream(result);
response.StatusCode = HttpStatusCode.OK;
response.Content = new StreamContent(ms);
response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/pdf");
response.Content.Headers.Add("content-disposition", "attachment;filename=myFile.pdf");
return response;