Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Rotativa.aspnetcore中的生成文件错误_C#_Asp.net Core_Asp.net Core 2.0_Rotativa - Fatal编程技术网

C# Rotativa.aspnetcore中的生成文件错误

C# Rotativa.aspnetcore中的生成文件错误,c#,asp.net-core,asp.net-core-2.0,rotativa,C#,Asp.net Core,Asp.net Core 2.0,Rotativa,在asp.net core 2.1应用程序中使用rotative将视图转换为pdf时,会出现错误 值不能为null。参数名称:path1 下面是我的代码 var rpt = new ViewAsPdf(); //rptLandscape.Model = Model; rpt.PageOrientation = Rotativa.AspNetCore.Options.Orientation.Landscape; rpt.Pag

在asp.net core 2.1应用程序中使用rotative将视图转换为pdf时,会出现错误

值不能为null。参数名称:path1

下面是我的代码

var rpt = new ViewAsPdf();
            //rptLandscape.Model = Model;
            rpt.PageOrientation = Rotativa.AspNetCore.Options.Orientation.Landscape;
            rpt.PageSize = Rotativa.AspNetCore.Options.Size.A4;
            rpt.ViewName = "Test";
            byte[] arr = await rpt.BuildFile(actionContextAccessor.ActionContext);
            System.IO.File.WriteAllBytes(Path.Combine(env.WebRootPath, "PDFStorage", "File.pdf"), arr);
虽然它成功地以pdf格式返回网页,但我想将其存储在一个文件夹中。 此错误的可能原因是什么,我已全部选中,它甚至不包含名为name1的属性

更新1:错误不在Path.Combine()中,错误在它前面的行中

byte[] arr = await rpt.BuildFile(actionContextAccessor.ActionContext);

Path.Combine
如果其中一个输入字符串为
null
,则抛出
ArgumentNullException

env.WebRootPath
null
,请确保已使用值初始化它


路径的组合:

public static String Combine(String path1, String path2, String path3) {
    if (path1 == null || path2 == null || path3 == null)
        throw new ArgumentNullException((path1 == null) ? "path1" : (path2 == null) ? "path2" : "path3");
    Contract.EndContractBlock();
    CheckInvalidPathChars(path1);
    CheckInvalidPathChars(path2);
    CheckInvalidPathChars(path3);

    return CombineNoChecks(CombineNoChecks(path1, path2), path3);
}

短版

您需要调用
RotativaConfiguration.Setup(env)Startup.cs
中,下载并部署另一个工具来执行实际的转换工作。你可能会找到另一个图书馆

长版本

如果没有实际的异常及其调用堆栈,人们只能猜测,或者检查并尝试猜测可能出现的错误

构建文件的源代码是:

   public async Task<byte[]> BuildFile(ActionContext context)
    {
        if (context == null)
            throw new ArgumentNullException("context");

        //if (this.WkhtmlPath == string.Empty)
        //    this.WkhtmlPath = context.HttpContext.Server.MapPath("~/Rotativa");

        this.WkhtmlPath = RotativaConfiguration.RotativaPath;

        var fileContent = await CallTheDriver(context);

        if (string.IsNullOrEmpty(this.SaveOnServerPath) == false)
        {
            File.WriteAllBytes(this.SaveOnServerPath, fileContent);
        }

        return fileContent;
    }
如果
wkhtmlPath
为null,则会出现null参数异常。所有这些调用都将出现在异常的调用堆栈中

解决方案是确保正确设置了
RotativaConfiguration.RotativaPath
属性。回购协议本身:

在Startup.cs中完成基本配置:

确保运行web应用的进程可以访问包含wkhtmltopdf.exe文件的文件夹。默认情况下,它在web应用程序根目录中名为“Rotativa”的文件夹中搜索。如果需要更改,请将可选参数用于设置调用RotativaConfiguration.Setup(env,“path/relative/to/root”)

顺便说一句,在web应用程序中运行单独的可执行文件是一个非常非常糟糕的主意:

  • 可伸缩性丧失。为每个请求运行一个单独的可执行文件是非常昂贵的,并且很容易使繁忙的服务器陷入瘫痪。这就是为什么生产服务器不能以这种方式工作。如果进程挂起,请求将被传递。最终可能会出现孤立进程
  • 其次,它需要提升权限——web应用程序的帐户必须能够执行任意可执行文件,这是不允许的 最后,忘记跨平台部署。可执行文件名为“wkhtmltopfd.exe”,尽管该网站提供了所有操作系统的版本


    顺便说一句,该工具本身提供了一个C库供其他应用程序使用

    ,这不是编译错误,而是运行时错误。发布包括调用堆栈在内的完整异常。您可以使用
    Exception.ToString()
    轻松获得它。尽管我怀疑如果调试代码,您会发现
    env.WebRootPath
    是NULL@PanagiotisKanavos请参阅更新1发布整个异常以及错误发生的位置。不要强迫人们猜测。异常的调用堆栈将显示使用空路径调用的方法。这可能足以找出问题所在。例如,如果一个
    LoadReportUsingTemplateFileName()
    抛出了这个问题,那么很可能某个模板属性没有值。需要设置WkhtmlPath属性,谢谢。但它总是自动走这条路,不知道这次出了什么问题
            var proc = new Process
            {
                StartInfo = new ProcessStartInfo
                {
                    FileName = Path.Combine(wkhtmlPath, wkhtmlExe),
                    Arguments = switches,
                    UseShellExecute = false,
                    RedirectStandardOutput = true,
                    RedirectStandardError = true,
                    RedirectStandardInput = true,
                    WorkingDirectory = wkhtmlPath,
                    CreateNoWindow = true
                }
            };
            proc.Start();
    
    RotativaConfiguration.Setup(env);