ConfigurationManagerを使用してWeb.Configからキーを読み取る


284

Web.configWebレイヤーとは異なるレイヤーのファイルからキーを読み取ろうとしています(同じソリューション)

これが私が試していることです:

string userName = System.Configuration.ConfigurationManager.AppSettings["PFUserName"];
string password = System.Configuration.ConfigurationManager.AppSettings["PFPassWord"];

そして、ここに私appSettingsWeb.configファイルがあります:

<configuration>
   ....
   <appSettings>
      <add key="PFUserName" value="myusername"/>
      <add key="PFPassWord" value="mypassword"/>
   </appSettings>
   ....
</configuration>

私がコードをデバッグするusernamepassword、だけなnullので、キーの値を取得できません。

これらの値を読み取るために私は何を間違っていますか?


この2番目のプロジェクトはどのようにしてWebサイトからアクセスされていますか?
Dan Atkinson、2011年

13
構文は正しいです。おそらく間違ったweb.configファイルを編集したため、が返されますNULL。遅いコメントですが、誰もこれを指摘しませんでした。
Hammad Khan 14年

1
それが私に起こったことです、私はビューのweb.configにいました。
JQII 2014

1
WebプロジェクトのみがSystem.Configuration.ConfigurationManager.AppSettingsオブジェクトにアクセスできます。他のレイヤーはSystem.Webを実装していないため、このオブジェクトにアクセスできません。
Hashim Akhtar、2016

回答:


475

代わりにWebConfigurationManagerクラスを使用してみてください。例えば:

string userName = WebConfigurationManager.AppSettings["PFUserName"]

2
回答ありがとうございます。私はあなたが推奨したとおりに試しても、同じ結果が得られました。私は実際にToString()でNullReferenceExceptionを取得しています
twal

null例外が発生した場合は、設定が見つからないことを意味します。次のようなことを試してください: "object x = WebConfigurationManager.AppSettings [" PFUserName "];" そしておそらくあなたはそれが要求された設定を見つけていないことを意味するnull値を得るでしょう。
ヘクターコレア2011年

21
設定が正しいweb.configにあることを確認しますか?(私は、「ビュー」フォルダの下にあるweb.configで私の値をダンプする前にミスを犯し、期待どおりに動作していない理由は、時間のトラブルシューティングのトンを失ってしまった。
ヘクターコレア

すごい。よかったです。
ヘクターコレア2011年

4
ありがとうございます。AppSettingsインデクサーは既に文字列を返しているため、ToStringを削除できます。
Ido Ran

43
  var url = ConfigurationManager.AppSettings["ServiceProviderUrl"];

12
正しい答え。ToString()しかし冗長です。
anar khalilov 2013年

9
値がアプリ構成にない場合、ToStringは危険な場合があります。返されたオブジェクトをトラップし、解決する前にnullをテストすることをお勧めします。「mysettings」が構成にないときに実行してみてください。例外のポップアップが表示されます。代わりに、以下のようなものがより安全かもしれません... string key = "mysettings"; 文字列値= ConfigurationManager.AppSettings [key]; if(value == null)value = "不明な値";
Joe Healy

1
trueは文字列なので.ToString()は必要ありません
Rola

2
:@JoeHealyあなたは演算子を合体ヌルでいると増加明確さを短くすることができますstring value = ConfigurationManager.AppSettings[key] ?? "unknown value"
Zenexer

この答えとOPの質問のコードの違いは何ですか?彼らは同じではありませんか?
user1451111

6

呼び出し元が別のプロジェクトの場合は、呼び出されたプロジェクトではなく、呼び出し元のプロジェクトに構成を書き込む必要があります。


6

この解決策は非常に役に立ちました。C#4.0 DynamicObjectを使用してConfigurationManagerをラップします。したがって、次のような値にアクセスする代わりに:

 WebConfigurationManager.AppSettings["PFUserName"]

プロパティとしてそれらにアクセスします:

dynamic appSettings = new AppSettingsWrapper();
Console.WriteLine(appSettings.PFUserName);  

編集:リンクが古くなった場合のコードスニペットの追加:

public class AppSettingsWrapper : DynamicObject
{
     private NameValueCollection _items;

    public AppSettingsWrapper()
    {
        _items = ConfigurationManager.AppSettings;
    }

     public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        result = _items[binder.Name];
        return result != null;
    }
}


2

2つのWeb.configファイルがあります。これら2つのファイルを混同していると思います。

この画像を確認してください:

このリンクをクリックして、この画像を確認してください

この画像には、2つのWeb.configファイルがあります。定数は、viewsフォルダーではなくプロジェクトフォルダーにある定数に追加する必要があります。

これがあなたに役立つことを願っています


1

この問題は、このプロジェクトが別のプロジェクトで使用されている場合に発生します。アプリ設定キーを必ず親プロジェクトのapp.configまたはweb.configにコピーしてください。


1

また、この行を試して、app.configファイルから文字列値を取得することもできます。

var strName= ConfigurationManager.AppSettings["stringName"];

0

.configファイルで以下の設定を想定して:

<configuration>
   <appSettings>
     <add key="PFUserName" value="myusername"/>
     <add key="PFPassWord" value="mypassword"/>
   </appSettings> 
</configuration>

これを試して:

public class myController : Controller
{
    NameValueCollection myKeys = ConfigurationManager.AppSettings;

    public void MyMethod()
    {
        var myUsername = myKeys["PFUserName"];
        var myPassword = myKeys["PFPassWord"];
    }
}

-5

申し訳ありませんが、これはテストしていませんが、次のように行われたと思います。

var filemap = new System.Configuration.ExeConfigurationFileMap();            
System.Configuration.Configuration config =  System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(filemap, System.Configuration.ConfigurationUserLevel.None);

//usage: config.AppSettings["xxx"]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.