外部ファイルアクセスを伴うライブラリとASP.NET
ASP.NETの話です。
ASP.NETのプロジェクトから、直接サーバーのローカルファイルにアクセスできないのは、Webアプリケーションを組んでいれば、大体予想がつきますよね。
でも、それがライブラリ、しかも自分の作ったものではないライブラリだと、なかなか気が付きにくい場合があります。
ミドルウェアにアクセスするためのライブラリを使ったプロジェクトが最近あったのですが、どうしてもASP.NETのWebサービスから、そのミドルウェアにアクセスしようとするとエラーが発生する、という事態になりました。
エラーが出る時と出ない時があり、エラーになると、再起動しようがなにしようが直らない。
そのDLLから飛んでくる例外のメッセージをみると、「キャッシュにアクセスできない」という感じの内容です。
さて、キャッシュってなんじゃらほい、と調べてみると、そのライブラリが独自のフォルダを用意して、キャッシュしていることが分かりました。
そして、そのライブラリをインストールする際に、インストーラー内でミドルウェアへのテスト接続を実行すると、あとで必ずWebサービス側がうまく動かなくなることが分かってきました。
1)テスト接続をすると、インストーラーが「インストーラー実行者の権限」でキャッシュファイルを作成する。
2)ASP.NETのワーカープロセスは組み込みIDであるNetworkServiceでDLLを実行するので、1)で作成されたキャッシュファイルにはアクセスできない
3)さようなら
と、こんな流れになっていたのです。
ちなみに解決策は、ワーカープロセスのアカウントを別のローカルユーザーアカウントに変更することです。
もちろんそのローカルユーザーは、IISのワーカープロセスグループに所属させなければいけません。
このエントリで大事なことは「ASP.NETからライブラリを使うときは、そのDLLがどんなファイル操作をするかを把握しておかないと痛い目をみるよ」ということです。
ちなみに、このミドルウェアとはEMC社の文書管理サーバー「Documentum」。
EMC社のユーザーグループのBBSに書こうかと思いましたが、アカウントもないし英語で書くのもイヤなので、こっちに書きました。
日本語のできないプログラマーの方、頑張ってください。