1

これが私のアプリケーションの構造です。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 宣言を通過できないことですArgumentOfOfRangeExceptionrootがの VS Projects フォルダーを指しているため、これはテスト中に予想されていましたC:\\Users\\me\\Documents\\Visual Studio 2012\\Projects。そこにテストファイルをドロップしweb.configましたが、それでも例外が発生します。運用サーバーでは、パスは構成ファイルを含む親アプリケーションのルート フォルダーを指します。

また、WCF サービス内でHttpContext.Currentは常に null であるため、そのRequestメソッドを使用して仮想パスを取得することはできません。についても同様ですServer.MapPath。何か案は?最終的に親アプリのweb.config.

4

2 に答える 2

2

ConfigurationManger仮想パスが必要ないこの場合に使用する正しい方法を最終的に見つけました。コードは次のとおりです。

//web config subfolder and filename
const string WEB_CONFIG = "\\Web.config";

//open parent application's web.config file to get connection string to specific database
string svcDir = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
DirectoryInfo rootDir = Directory.GetParent(svcDir).Parent.Parent;
string root = rootDir.FullName;
string webconfigPath = root + WEB_CONFIG;

ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = webconfigPath;
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);

string connectionString = "";
if (configuration.ConnectionStrings.ConnectionStrings["db_name"].ConnectionString.Length > 0)
{
    connectionString = configuration.ConnectionStrings.ConnectionStrings["db_name"].ConnectionString;
}

魅力のように機能します。

于 2013-08-27T21:01:37.410 に答える