Javascript Web サイトをレンダリングできる Web クローラーを開発しているので、人気のある Node.JS ヘッドレス Chrome ブラウザー Pupeeteer API の .NET ポートである PupeeteerSharp を使用することにしました。Windows 10 開発マシンで Service Fabric のローカル開発クラスターを実行しており、ソリューションにステートレス サービスが 1 つあります。
Data
Service プロジェクトのPackageRoot
フォルダーの下にフォルダーを作成し、.local-chromium
そこにフォルダーの内容 (chrome.exe
実行可能ファイルを含む) を配置して、サービスの独立したデータ パッケージとしてデプロイします。
また、この XML 構成行をServiceManifest.xml
ファイルに配置しました。
<DataPackage Name="Data" Version="1.0.0" />
これまでのところ問題なく、ヘッドレス ブラウザのコンテンツが SFCluster Data パッケージ ディレクトリに正しくコピーされています。
次に、Stateless Service コードで、次のように Pupeeteer chromium 実行可能ファイルを呼び出そうとします。
var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = true,
ExecutablePath = _chromiumPath // @$"{context.CodePackageActivationContext.GetDataPackageObject("Data").Path}\.local-chromium\Win64-706915\chrome-win\chrome.exe"
});
using (var page = (await browser.NewPageAsync()))
{
Response renderResponse;
try
{
renderResponse = await page.GoToAsync(webPage.AbsoluteUri, timeout);
if (renderResponse.Status != System.Net.HttpStatusCode.OK)
{
return new RenderResult(RenderStatus.OtherFailure);
}
// other code
}
catch (TimeoutException)
{
return new RenderResult(RenderStatus.Timeouted);
}
この行で:using (var page = (await browser.NewPageAsync()))
私のコード (スレッド) は、戻ることなく単にハングします。デバッグ コンソールでは、多くのスレッドの終了が表示されますが、例外は発生しません。以前、クロム フォルダーのコンテンツの適切なコピーに関する他のエラーを修正していたときに System.IO.FileNotFoundException が発生していましたが、これらのエラーがなくなったため、コードが .exe を見つけたように見えますが、何らかの理由で PupeeterSharp のヘッドレス モードを開始できません。
これは、Service Fabric のネイティブ アプリケーション モデルで外部の .exe chromium バイナリを単純に実行できないということですか? 代わりに Docker および Linux コンテナーを使用する必要がありますか?