การอ่านคีย์จาก Web.Config โดยใช้ ConfigurationManager


284

ฉันพยายามอ่านคีย์จากWeb.configไฟล์ในเลเยอร์ที่แตกต่างจากเลเยอร์เว็บ (วิธีแก้ปัญหาเดียวกัน)

นี่คือสิ่งที่ฉันพยายาม:

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

และนี่ก็เป็นของฉันappSettingsในWeb.configไฟล์:

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

เมื่อฉันตรวจแก้จุดบกพร่องรหัสusernameและpasswordเป็นเพียงnullจึงไม่ได้รับค่าของคีย์

ฉันทำอะไรผิดเพื่ออ่านค่าเหล่านี้


เว็บไซต์ของคุณเข้าถึงโครงการที่สองนี้โดยวิธีใด?
Dan Atkinson

13
ไวยากรณ์ของคุณถูกต้อง คุณอาจจะแก้ไขไฟล์ web.config NULLผิดที่ว่าทำไมมันกลับ แสดงความคิดเห็นช้า แต่ไม่มีใครชี้เรื่องนี้
Hammad Khan

1
นั่นคือสิ่งที่เกิดขึ้นกับฉันฉันอยู่ในเว็บวิว
JQII

1
เฉพาะโครงการเว็บเท่านั้นที่สามารถเข้าถึงวัตถุ System.Configuration.ConfigurationManager.AppSettings เลเยอร์อื่นไม่สามารถเข้าถึงวัตถุนี้ได้เนื่องจากพวกเขาไม่ได้ใช้ System.Web
Hashim Akhtar

คำตอบ:


475

ลองใช้คลาส WebConfigurationManager แทน ตัวอย่างเช่น:

string userName = WebConfigurationManager.AppSettings["PFUserName"]

2
ขอบคุณสำหรับคำตอบของคุณฉันลองตามที่คุณแนะนำและยังได้ผลลัพธ์เดียวกัน ตอนนี้ที่จริงฉันได้รับ NullReferenceException บน ToString ()
twal

หากคุณได้รับข้อยกเว้น null หมายความว่าไม่ได้ค้นหาการตั้งค่า ลองทำอะไรเช่นนี้: "object x = WebConfigurationManager.AppSettings [" PFUserName "];" และคุณอาจจะได้รับค่า Null ซึ่งหมายความว่าไม่พบการตั้งค่าที่ร้องขอ
Hector Correa

21
คุณแน่ใจหรือว่าการตั้งค่านั้นอยู่ใน web.config ที่ถูกต้อง? (ผมเคยทำผิดพลาดก่อนที่จะทิ้งค่าของฉันใน web.config ภายใต้ "ชม" โฟลเดอร์และการสูญเสียตันของการแก้ไขปัญหาเวลาทำไมมันไม่ได้ทำงานตามที่คาดไว้.
เฮ็กเตอร์กอร์

ยิ่งใหญ่ ฉันดีใจที่มันทำ
Hector Correa

4
ขอบคุณคุณสามารถปล่อย ToString ได้เนื่องจากตัวสร้างดัชนี AppSettings ส่งคืนสตริงแล้ว
Ido Ran

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

12
คำตอบที่ถูกต้อง ToString()ซ้ำซ้อนแม้ว่า
anar khalilov

9
ToString อาจเป็นอันตรายหากค่าไม่ได้อยู่ในการกำหนดค่าแอป ดีกว่าที่จะดักจับวัตถุที่คืนมาและทดสอบหาค่าว่างก่อนแก้ไข ลองใช้งานเมื่อ "mysettings" ไม่ได้อยู่ในการกำหนดค่าและคุณจะเห็นข้อยกเว้นปรากฏขึ้น สิ่งที่ต้องการด้านล่างอาจปลอดภัยกว่า ... string key = "mysettings"; ค่าสตริง = ConfigurationManager.AppSettings [กุญแจ]; if (value == null) value = "ค่าที่ไม่รู้จัก";
Joe Healy

1
เป็นจริงไม่จำเป็นต้องใช้. ToString () เนื่องจากเป็นสตริง
Rola

2
@JoeHealy คุณสามารถย่อให้สั้นและเพิ่มความคมชัดด้วยตัวดำเนินการรวมศูนย์ว่าง:string value = ConfigurationManager.AppSettings[key] ?? "unknown value"
Zenexer

ฉันสงสัยว่าอะไรคือความแตกต่างระหว่างคำตอบนี้และรหัสในคำถามของ OP! พวกเขาไม่เหมือนกันหรือไม่
user1451111

6

หากผู้เรียกเป็นโครงการอื่นคุณควรเขียนการกำหนดค่าในโครงการผู้โทรไม่ใช่โครงการที่เรียกว่า


6

ฉันพบว่าวิธีนี้มีประโยชน์มาก มันใช้ DynamicObject C # 4.0 เพื่อห่อ 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

จะมีไฟล์ Web.config สองไฟล์ ฉันคิดว่าคุณอาจสับสนกับไฟล์ทั้งสอง

ตรวจสอบภาพนี้:

คลิกที่ลิงค์นี้และตรวจสอบภาพนี้

ในภาพนี้คุณสามารถดูไฟล์ Web.config สองไฟล์ คุณควรเพิ่มค่าคงที่ของคุณไปยังที่อยู่ในโฟลเดอร์โครงการไม่ได้อยู่ในโฟลเดอร์มุมมอง

หวังว่านี่อาจช่วยคุณได้


1

ปัญหานี้เกิดขึ้นหากโครงการนี้กำลังถูกใช้โดยโครงการอื่น ตรวจสอบให้แน่ใจว่าคุณคัดลอกคีย์การตั้งค่าแอพไปยัง app.config หรือ web.config ของโปรเจ็กต์หลัก



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.