0

Javascript Web サイトをレンダリングできる Web クローラーを開発しているので、人気のある Node.JS ヘッドレス Chrome ブラウザー Pupeeteer API の .NET ポートである PupeeteerSharp を使用することにしました。Windows 10 開発マシンで Service Fabric のローカル開発クラスターを実行しており、ソリューションにステートレス サービスが 1 つあります。

DataService プロジェクトの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 コンテナーを使用する必要がありますか?

4

0 に答える 0