これが私のアプリケーションの構造です。Web サイトのルートで実行されている asp.net Web アプリケーションがあります。私が持っている子ディレクトリにWebServices\MyWCFService\
. ここで概説:
\parentapp\
\parentapp\App_Data\
\parentapp\Web.config
\parentapp\other_parent_stuff
\parentapp\WebServices\
\parentapp\WebServices\MyWCFService\
\parentapp\WebServices\MyWCFService\bin\
\parentapp\WebServices\MyWCFService\bin\MyWCFService.dll
\parentapp\WebServices\MyWCFService\Web.config (WCF's .config)
\parentapp\WebServices\MyWCFService\other_wcf_stuff
最終的に必要なことは、ルート アプリケーションを開いてweb.config
接続文字列を取得し、WCF サービスがそこにあるデータベース情報に接続できるようにすることです。WCF から独自の を取得できますが、それを取得web.config
するには Web サイトのルートに移動する必要がありweb.config
ます。これを行うことでルートディレクトリを取得します:
string svcDir = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
DirectoryInfo rootDir = Directory.GetParent(svcDir).Parent.Parent;
string root = rootDir.FullName;
明らかに設定ファイルを開くには、次のように (ローカル ファイル システム パスではなく) 仮想パスを使用する必要があります。
VirtualDirectoryMapping vdm = new VirtualDirectoryMapping(root, true);
WebConfigurationFileMap wcfm = new WebConfigurationFileMap();
wcfm.VirtualDirectories.Add("/", vdm);
Configuration config = WebConfigurationManager.OpenMappedWebConfiguration(wcfm, "/");
そこから、 を呼び出して接続文字列にアクセスできるはずconfig.ConnectionStrings.ConnectionStrings["db_name"]
です。
問題は、.config を取得している config 宣言を通過できないことですArgumentOfOfRangeException
。root
がの VS Projects フォルダーを指しているため、これはテスト中に予想されていましたC:\\Users\\me\\Documents\\Visual Studio 2012\\Projects
。そこにテストファイルをドロップしweb.config
ましたが、それでも例外が発生します。運用サーバーでは、パスは構成ファイルを含む親アプリケーションのルート フォルダーを指します。
また、WCF サービス内でHttpContext.Current
は常に null であるため、そのRequest
メソッドを使用して仮想パスを取得することはできません。についても同様ですServer.MapPath
。何か案は?最終的に親アプリのweb.config
.