これが私のアプリケーションの構造です。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.