C# Rotativa.aspnetcore中的生成文件错误
在asp.net core 2.1应用程序中使用rotative将视图转换为pdf时,会出现错误 值不能为null。参数名称:path1 下面是我的代码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
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);