スポンサーリンク

2016年7月12日火曜日

SQLite でネットワーク上のファイルにアクセスする方法

 ASP.NET MVC で Web アプリケーションを作成し、IIS 8 にデプロイするという環境。
 アプリケーションでデータベースには SQLite を使用。ちなみに EntityFramework(Database First) で使ってます。
 なので、接続文字列とかは Web.config に記述される。 

 ここで Web サーバが 2 台構成で運用されることになっており、SQLite でローカルファイルにデータを保存していると、ロードバランサーで冗長化したときにデータの不整合が起こる。
 というわけで、どこかにある共有可能なサーバに SQLite データベースファイルを保存することになったわけだけど、IIS において、デフォルトの設定ではネットワーク上の別のサーバにあるファイルにアクセスできない。

 サーバ辺りの設定と Web.config の記述でちょっとハマッたのでメモ。
 SQLite で EntityFramework 使うとか、ASP.NET MVC で Database First でモデルクラスを作るとか、その辺りのことは今は割愛。

 今回行った対処法は、IIS が動作するサーバと目的のファイルが置いてあるサーバに同じユーザアカウントを作成し、そのアカウントで目的の Web アプリケーションを動作させるようにする方法。
 このとき、作成するユーザアカウントのパスワードも同じじゃないと駄目、なはず、たぶん。

 とりあえず管理ツールなりコントロールパネルなりで、 Web アプリケーションを動作させるユーザアカウントを作成する。
 同じユーザ名とパスワードでファイルを配置するサーバ側にもユーザアカウントを作成する。

 続いて、IIS マネージャーを開いて、アプリケーションプールの一覧を表示し、目的の Web アプリケーションを動作させるアプリケーションプールの詳細設定を開く。
 プロセスモデルの ID の項目が、デフォルトで ApplicationPoolIdentity となっているところに、作成したユーザアカウントを指定する。
 例えばこんな感じに。とりあえず僕の名前をサンプルでw


 次はファイルを配置するサーバ側の設定。
 目的のファイルを配置するフォルダを共有し、同じく作成したユーザにアクセス権を与える。


 最後に、ファイルのパスを記述した Web.config の書き方。
 実はこれが一番よくわからんところ……。

 ネットワークパスでファイルのパスを書くわけだけど、最初のデリミタ、円マークは4つ必要。
 これはエスケープするから、と理解できるんだけど、途中のデリミタは1つでも動作する。

例)\\\\server\folder\file.txt

 同じ理屈で言えば、途中のデリミタもエスケープしなきゃ駄目じゃないかと思うんだけど。

例)\\\\server\\folder\\file.txt

 XML の仕様を読めばいいんだろうけど、面倒なので確認してません。


 アプリケーション的にファイルの競合とか大丈夫か、とかはここでは考えないことにしています。

 なお、サーバの設定変更等や、このファイル配置にして何らかの障害が発生しても責任は負いません!自己責任でお願いします。

0 件のコメント:

コメントを投稿