3

PDF を生成しようとしていますが、開発では完全に機能しますが、運用サーバーでは機能しません。私はそれが許可の問題だと思います。私が得るエラーは次のとおりです。

値を null にすることはできません。パラメータ名:fileContents

このfileContentsパラメーターについて話していると思います:

   System.Web.Mvc.Controller.File(Byte[] fileContents, String contentType, String fileDownloadName) +28

メソッドのコードは次のとおりです。

    public ActionResult Pdf(Guid id, string filename)
    {
        string url = Url.Action("RenderReport", "TitleSearchReport", new { id = id }, "http");

        var file = WKHtmlToPdf(url);

        return File(file, "application/pdf", Server.UrlEncode(filename));
    }

ファイルを生成するコードは次のとおりです。

    public byte[] WKHtmlToPdf(string url)
    {
        var fileName = " - ";
        //var wkhtmlDir = "C:\\Program Files\\wkhtmltopdf\\";
        //var wkhtml = "C:\\Program Files\\wkhtmltopdf\\wkhtmltopdf.exe";
        var wkhtmlDir = HttpContext.Server.MapPath(@"~/wkhtmltopdf");
        var wkhtml = HttpContext.Server.MapPath(@"~/wkhtmltopdf/wkhtmltopdf.exe");
        var p = new Process();

        p.StartInfo.CreateNoWindow = true;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.RedirectStandardError = true;
        p.StartInfo.RedirectStandardInput = true;
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.FileName = wkhtml;
        p.StartInfo.WorkingDirectory = wkhtmlDir;

        string switches = "";
        switches += "--print-media-type ";
        switches += "--margin-top 10mm --margin-bottom 10mm --margin-right 10mm --margin-left 10mm ";
        switches += "--page-size Letter ";
        p.StartInfo.Arguments = switches + " " + url + " " + fileName;
        p.Start();

        //read output
        byte[] buffer = new byte[32768];
        byte[] file;
        using (var ms = new MemoryStream())
        {
            while (true)
            {
                int read = p.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length);

                if (read <= 0)
                {
                    break;
                }
                ms.Write(buffer, 0, read);
            }
            file = ms.ToArray();
        }

        // wait or exit
        p.WaitForExit(60000);

        // read the exit code, close process
        int returnCode = p.ExitCode;
        p.Close();

        return returnCode == 0 ? file : null;
    }

繰り返しますが、デバッグ時には完全に機能しますが、デプロイ時には機能しません。これを本番環境で機能させるにはどうすればよいですか?

アドバイスありがとうございます。

編集:

私の方法をこれに変更しましたが、今では空白のページしか得られません...

    public void Pdf(Guid id, string filename)
    {
        string url = Url.Action("RenderReport", "TitleSearchReport", new { id = id }, "http");

        var file = WKHtmlToPdf(url);

        if (file != null)
        {
            Response.ContentType = "Application/pdf";
            Response.BinaryWrite(file);
            Response.End();
        }
    }
4

1 に答える 1

0

解決策は、ネットワーク ユーザーのルートに読み取りと書き込みのアクセス許可を適用することでした。セキュリティへの影響がわかりません...

于 2013-03-11T14:27:55.083 に答える