Đọc khóa từ Web.Config bằng Trình quản lý cấu hình


284

Tôi đang cố đọc các khóa từ Web.configtệp trong một lớp khác với lớp web (Cùng một giải pháp)

Đây là những gì tôi đang cố gắng:

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

Và đây là của tôi appSettingstrong Web.configtập tin:

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

Khi tôi gỡ lỗi mã usernamepasswordchỉ null, vì vậy nó không nhận được giá trị của các khóa.

Tôi đang làm gì sai để đọc những giá trị này?


Làm thế nào là dự án thứ hai này được truy cập bởi trang web của bạn?
Dan Atkinson

13
Cú pháp của bạn là chính xác . Bạn có thể đã chỉnh sửa tệp web.config sai đó là lý do tại sao nó trả về NULL. Nhận xét muộn nhưng không ai chỉ ra điều này.
Hammad Khan

1
Đó là những gì đã xảy ra với tôi, tôi đã ở trong Lượt xem web.config.
JQII

1
Chỉ có dự án Web mới có quyền truy cập vào đối tượng System.Configuration.ConfigurationManager.AppSinstall. Các lớp khác không thể truy cập đối tượng này vì chúng không triển khai System.Web.
Hashim Akhtar

Câu trả lời:


475

Thay vào đó, hãy thử sử dụng lớp WebConfigurationManager. Ví dụ:

string userName = WebConfigurationManager.AppSettings["PFUserName"]

2
Cảm ơn câu trả lời của bạn, tôi đã thử như bạn đề nghị và vẫn nhận được kết quả tương tự. Bây giờ tôi thực sự nhận được một NullReferenceException trên ToString ()
twal

Nếu bạn nhận được một ngoại lệ null, điều đó có nghĩa là không tìm thấy cài đặt. Hãy thử làm một cái gì đó như thế này: "object x = WebConfigurationManager.AppSinstall [" PFUserName "];" và bạn có thể sẽ nhận được một giá trị null, điều đó có nghĩa là nó không tìm thấy cài đặt được yêu cầu.
Hector Correa

21
Bạn có chắc chắn các cài đặt nằm trên đúng web.config không? (Tôi đã phạm sai lầm trước khi bỏ các giá trị của mình vào web.config trong thư mục "Lượt xem" và mất rất nhiều thời gian để khắc phục sự cố tại sao nó không hoạt động như mong đợi.
Hector Correa

Tuyệt quá. Tôi vui vì nó đã làm.
Hector Correa

4
Cảm ơn bạn, Bạn có thể bỏ ToString vì trình chỉ mục AppSinstall đã trả về chuỗi.
Ido Ran

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

12
Câu trả lời đúng. ToString()là dư thừa mặc dù.
anar khalilov

9
ToString có thể nguy hiểm nếu giá trị không có trong cấu hình ứng dụng. Tốt hơn để bẫy đối tượng trả lại và kiểm tra null trước khi giải quyết. Hãy thử chạy nó khi "mysinstall" không có trong cấu hình và bạn sẽ thấy cửa sổ bật lên ngoại lệ. Thay vào đó, một cái gì đó như những gì bên dưới có thể an toàn hơn ... chuỗi key = "mysinstall"; chuỗi value = ConfigurationManager.AppSinstall [key]; if (value == null) value = "giá trị không xác định";
Joe Healy

1
đúng là không cần .ToString () vì nó là một chuỗi
Rola

2
@JoeHealy Bạn có thể rút ngắn điều đó và tăng độ rõ ràng với toán tử liên kết null:string value = ConfigurationManager.AppSettings[key] ?? "unknown value"
Zenexer

Tôi tự hỏi sự khác biệt giữa câu trả lời này và mã trong câu hỏi của OP! Họ không giống nhau?
user1451111

6

Nếu người gọi là một dự án khác, bạn nên viết cấu hình trong dự án người gọi không phải là dự án được gọi.


6

Tôi thấy giải pháp này khá hữu ích . Nó sử dụng C # 4.0 DynamicObject để bọc Trình quản lý cấu hình. Vì vậy, thay vì truy cập các giá trị như thế này:

 WebConfigurationManager.AppSettings["PFUserName"]

bạn truy cập chúng như một tài sản:

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

EDIT : Thêm đoạn mã trong trường hợp liên kết trở nên cũ:

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

Đường dẫn đầy đủ cho nó là

System.Configuration.ConfigurationManager.AppSettings["KeyName"]

2

Sẽ có hai tệp Web.config. Tôi nghĩ rằng bạn có thể đã nhầm lẫn với hai tập tin.

Kiểm tra hình ảnh này:

nhấp vào liên kết này và kiểm tra hình ảnh này

Trong ảnh này, bạn có thể thấy hai tệp Web.config. Bạn nên thêm các hằng số của mình vào một trong thư mục dự án không có trong thư mục khung nhìn

Hy vọng điều này có thể giúp bạn


1

Vấn đề này xảy ra nếu dự án này đang được sử dụng bởi một dự án khác. Đảm bảo rằng bạn sao chép các phím cài đặt ứng dụng vào app.config hoặc web.config của dự án mẹ.


1

Ngoài ra, bạn có thể thử dòng này để lấy giá trị chuỗi từ app.configtệp.

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

0

với giả định bên dưới cài đặt trong tệp .config:

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

thử cái này:

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

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

-5

Xin lỗi tôi đã không kiểm tra điều này nhưng tôi nghĩ nó đã được thực hiện như thế này:

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

//usage: config.AppSettings["xxx"]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.