我有一个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中并使用它,这种方式适用于命令行。