在WebApp中启动进程时,PhantomJS无法正常工作

时间:2014-05-01 02:11:32

标签: c# asp.net phantomjs

我有一个C#方法启动phantomJS.exe进程(将路径传递给JS文件和url)来获取该URL的html。当从Owin内部的web api动作方法调用时,这一切都很好。

现在我已经创建了一个单独的ASP.NET WebApp(空项目,使用IIS express)并为其添加了一个HttpModule。来自HttpModule的调用返回空数据。知道为什么会这样吗?我已经确认该类可以通过该方法进行传出的http调用。

从cmd开始,我已导航到此项目的bin文件夹,并使用这些参数运行phantomjs并成功获得结果。

有什么想法吗?

HttpModule(来电者):

private void Application_EndRequest(object sender, EventArgs e)
{
    var application = (HttpApplication)sender;
    HttpContext context = application.Context;

    context.Response.ClearContent();

    var service = new GetRenderedHtmlForUrlService();
    var result = service.GetHtml("http://www.example.com/");
    context.Response.Write(result);
}

PhantomJS Runner:

public string GetHtml(string url)
{
    var outputBuilder = new StringBuilder();

    var processStartInfo = new ProcessStartInfo();
    processStartInfo.CreateNoWindow = true;
    processStartInfo.RedirectStandardOutput = true;
    processStartInfo.RedirectStandardInput = true;
    processStartInfo.UseShellExecute = false;
    processStartInfo.Arguments = "Seo\\echo-html.js " + url;
    processStartInfo.FileName = @"phantomjs.exe";

    var process = new Process();
    process.StartInfo = processStartInfo;
    process.EnableRaisingEvents = true;

    process.OutputDataReceived += new DataReceivedEventHandler
    (
        delegate(object sender, DataReceivedEventArgs e)
        {
            //e.Data is always null when called from my webapp
            if (string.IsNullOrWhiteSpace(e.Data)) return;

            outputBuilder.Append(e.Data);
        }
    );

    var started = process.Start();
    process.BeginOutputReadLine();
    process.WaitForExit();

    process.CancelOutputRead();
    process.Kill();
    return outputBuilder.ToString();
}

更新:更多可能有用的信息:没有例外。我检查了process.StandardError并且它是空的。 PhantomJS在PATH中并使用它,这种方式适用于命令行。

0 个答案:

没有答案