C# 在Azure中将Tuhkin与MVC项目一起使用

C# 在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软件

我无法让pechkin或tuespechkin在我的azure站点上工作

每当我尝试访问该站点时,它都会挂起,没有错误消息,即使customErrors处于关闭状态。我还缺少其他设置吗?一切都在本地完美运行

对于64位应用程序,我将完成以下步骤:

使用Azure创建一个新的空MVC应用程序,确保已选择云中的主机 将应用程序更改为64位

登录azure门户并将应用升级为基本托管,然后将其更改为64位

安装TuesPechkin.Wkhtmltox.Win64和TuesPechkin nuget软件包 添加一个singleton类以返回IConverter

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;