12

ASP.NETWebサイトを備えたテストサーバーで問題が発生しました。私は間抜けで、デフォルトのWebサイトのホームディレクトリが間違った場所を指していました。私が試したとき:

ConfigurationManager.ConnectionStrings["connectionString"]; 

nullを返しましたが、

using System.Web.Configuration;

/* ... */

var rootWebConfig =
    WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);

WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);

rootWebConfig.ConnectionStrings.ConnectionStrings["connectionString"].ConnectionString;` 

正しい接続文字列を返しました。

2つのアプローチのすべての違いは何ですか?

編集:私が本当に求めているのは、ホームディレクトリが正しく設定されていない場合にConfigurationManagerアプローチが失敗するのに、そうでない場合はWebConfigurationManager成功し、ホームディレクトリが正しく設定されているかどうかに関係なく成功するのはなぜですか?アクセス制御に関する仮定など、他に違いはありますか?

4

2 に答える 2

32

これを試して:

ConfigurationManagerステートメントがある場所にブレークポイントを設定し、[イミディエイト出力]ウィンドウで次の手順を実行します ((ConfigurationSection) ConfigurationManager.GetSection("connectionStrings")).ElementInformation 。私のマシンは、以下に示すように、ソース: "C:\ Users \ John \ Documents \ Visual Studio 2008 \ Projects \ StackOverflowCode \ WebApplication1\web.config"を報告します。

注:以下は、私のものがASP.NETweb.configにアクセスしていることも示しています。

{System.Configuration.ElementInformation}
    Errors: {System.Configuration.ConfigurationException[0]}
    IsCollection: true
    IsLocked: false
    IsPresent: true
    LineNumber: 17
    Properties: {System.Configuration.PropertyInformationCollection}
    Source: "C:\\Users\\John\\Documents\\Visual Studio 2008\\Projects\\StackOverflowCode\\WebApplication1\\web.config"
    Type: {Name = "ConnectionStringsSection" FullName = "System.Configuration.ConnectionStringsSection"}
    Validator: {System.Configuration.DefaultValidator}

そして、実行するConfigurationManager.ConnectionStrings.ElementInformationと、Webアプリに適したSource:nullが表示されます。

構成ソースパスに対して何を取得しますか?


即時の仮定

ConfigurationManager.ConnectionStrings["connectionString"];Webアプリケーションのルートweb.configと必ずしも同じではない構成の場所を探す場合があります。おそらくそれはWindowsディレクトリを探しています(例えば、別の場所やmachine.configを探しています)。しかし、これに適したテストを見つけようとしています。


各マネージャーの意図

システム構成。ConfigurationManagerは、.NET構成XML形式にアクセスできます。つまり、次の両方を読み取ります。

  • Web構成(つまり、ASP.NETのweb.configファイル)
  • および非Web構成(例:app.configファイル-スタンドアロンコンソールアプリ、Windowsアプリなど)

構成のタイプに共通する側面を表現します。これは、汎用の構成マネージャーです。(ただし、両方のタイプの構成を確認できるこの機能にもかかわらず、次に説明するように、WebマネージャーはWeb構成に専念しているため、アプリ構成に使用する必要があります...)

System.Web.Configuration。WebConfigurationManagerはほとんど同じことを行いますが、構成マネージャーの「Web化」バージョンであり、構成のASP.NET Web固有の側面(ASP.NETのweb.configファイルなど)へのアクセスを提供します。

類似点

ConfigurationManager。*WebConfigurationManager。*の間のメンバーの類似点を参照してください

たとえば、両方のマネージャーがAppSettingsプロパティとプロパティにアクセスできConnectionStringsます。実際、これらの設定は両方とも両方の種類の構成に共通であり、XMLドキュメントの同じレベルにあります。

したがって、多くの類似点があります

行動の違い

構成へのアクセス:ConfigurationManagerには、EXECアプリに関連するスタンドアロンアプリ構成(つまり、Myprogram.EXEのApp.config)を開くメソッドがありますが、WebConfigurationManagerには、WebサイトのWebアプリケーションルートディレクトリに関連するASP.NETWeb構成を開くメソッドがあります。

これが基本的なapp.configです(たとえば、 ConfigurationManagerによってディスクフォルダーから「C:\ winapp \ app.config」を介して開かれます)

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings/>
  <connectionStrings/>
</configuration>

そして、これが基本的なweb.configです(たとえば、 WebConfigurationManagerによってWebサイトのルートを意味する「〜」を介して開かれます)

<?xml version="1.0"?>
<configuration>  
    <appSettings/>
    <connectionStrings/>

    <system.web>
        <!-- special web settings -->
    </system.web>

</configuration>

類似点に注意してください。また、Web構成にはsystem.webASP.NET用の追加要素があることに注意してください。

これらのマネージャーは、異なるアセンブリに配置されています。

  • ConfigurationManager:System.Configuration.dll
  • WebConfigurationManager:System.Web.dll
于 2010-01-13T23:22:07.417 に答える
1

最初のクラスは、一般的なクライアント構成ファイル(app.configなど)へのアクセスを提供し、2番目のクラスはWebアプリケーションのファイル(web.configなど)へのアクセスを提供します。

于 2010-01-13T23:12:21.967 に答える