.NET Cấu hình tệp cấu hình Nguồn bên ngoài thư mục thư mục ứng dụng


82

Tôi có hai ứng dụng, một là ứng dụng bảng điều khiển và ứng dụng còn lại là ứng dụng ASP.NET. Cả hai đều cần biết appSettings và connectionStrings giống nhau. Vì vậy, lý tưởng nhất là tôi muốn sử dụng thuộc tính configSource của tệp app.config / web.config để trỏ nó đến một vị trí trung tâm. Ví dụ

<connectionStrings configSource="D:\connectionStrings.config"/>
<appSettings configSource="D:\appSettings.config"/>

Tuy nhiên, điều đó không thành công với một lỗi:

Thuộc tính configSource không hợp lệ.: ConfigSource 'D: \ appSettings.config' không hợp lệ. Nó phải tham chiếu đến một tệp trong cùng thư mục hoặc trong một thư mục con như tệp cấu hình.

Vẫn còn cách sử dụng appSettings / connectionStrings của trình quản lý cấu hình và nhận các giá trị từ một vị trí bên ngoài?
Tôi hài lòng với việc phải thêm mã để làm điều đó, nhưng tôi không muốn phải thay thế toàn bộ hệ thống trình quản lý cấu hình.

Câu trả lời:


103

Một giải pháp khác chỉ đơn giản là thêm tệp cấu hình trong tất cả các dự án của bạn dưới dạng liên kết thay vì thực sự sao chép tệp vào các dự án của bạn. Sau đó đặt "Hành động xây dựng" của tệp thành "Nội dung" và "Sao chép vào Thư mục đầu ra" thành "Sao chép nếu mới hơn" và khi bạn biên dịch dự án, bạn sẽ có tệp trong thư mục đầu ra.

Để thêm tệp dưới dạng liên kết trong hộp thoại "Thêm mục hiện có", có một nút Thêm với trình đơn thả xuống. Chọn "Thêm dưới dạng liên kết" từ menu thả xuống trên nút Thêm để hoàn tất quy trình.


đẹp - dễ dàng hơn nhiều để mọi người hiểu hơn cách của tôi
Robert MacLean

10
xin chào, tôi thích câu trả lời này và đã cố gắng áp dụng nó cho dự án của riêng tôi và mọi thứ dường như hoạt động tốt khi tôi "xuất bản" ứng dụng của mình (db.config được sao chép vào webroot như bạn đã nói), nhưng không phải khi gỡ lỗi thông qua VS & Cassini. Thay vào đó, tôi nhận được ngoại lệ "Không thể mở tệp configSource 'db.config'". Có điều gì tôi thiếu để có thể làm được điều này không? Cảm ơn!
Funka

16
Tất nhiên chỉ ngay sau khi tôi quyết định phá vỡ và đăng một bình luận yêu cầu sự giúp đỡ thì tôi mới tìm ra nó ngay sau đó. Tôi nhận thấy db.config của tôi cũng được sao chép vào thư mục / bin /, vì vậy tôi đã cập nhật web.config của mình để thêm đường dẫn này vào configSourcevà tất cả đều có vẻ tốt. Cảm ơn một lần nữa!
Funka

1
@Funka - Kiểm tra xem bạn có đang gặp sự cố không vì thuộc tính "Build Action" của db.config của bạn được đặt thành "None" thay vì "Content" như web.config mặc định. Tôi tin rằng các cài đặt phải là "Build Action" = "Content" và "Copy to Output Directory" = "Không sao chép."
bopapa_1979

1
Điều này dường như không hoạt động khi gỡ lỗi trong VS 2013. Tôi đã thử giải pháp Erics và điều này cũng không hoạt động.
Chris Nevill,


16

Có vẻ như đó là cách nó được. configSource phải nằm trong cùng một thư mục hoặc sâu hơn.

Bạn có thể , mặc dù tôi không chắc bạn nên sử dụng liên kết cứng NTFS. [cười toe toét]


10

Visual Studio 2015

Nếu bạn đang gặp vấn đề này với Web.Config, câu trả lời được chấp nhận là đúng nhưng chỉ để mở rộng vì điều này đã khiến tôi phải tự hỏi:

Khi bạn thêm tệp .config vào dự án của mình bằng cách sử dụng 'Thêm dưới dạng liên kết' và sau đó đặt thuộc tính Sao chép của liên kết thành 'Sao chép nếu mới hơn' hoặc 'Sao chép luôn', thì tệp vật lý sẽ được sao chép vào thư mục / bin.

Vì vậy, khi bạn có một phần cấu hình được xác định trong Web.Config như thế này:

 <section name="mySpecialConfig" type="System.Configuration.AppSettingsSection" requirePermission="false" />

thì bạn phải xác định phần tử cấu hình liên quan như sau:

  <mySpecialConfig configSource="bin\MySpecialConfig.config">
  </mySpecialConfig>

sao cho configSource trỏ đến tệp bin vật lý \ MySpecialConfig.config không đến liên kết Ngoài ra, hãy lưu ý rằng đường dẫn là một đường dẫn vật lý tương đối .

Điều đó có vẻ khá rõ ràng nhưng nếu bạn chưa làm điều này trước khi tệp vật lý chưa ở trong thư mục \ bin, thì nó có thể không nhấp ngay được.


8

Bạn có thể tải cấu hình từ một vị trí tùy ý, nhưng nó sẽ không khả dụng thông qua các thuộc tính tĩnh của ConfigurationManager:

Configuration myConfig = ConfigurationManager.OpenExeConfiguration(path)

(Có quá tải cho phép các tệp multuple được chỉ định, để hỗ trợ phân cấp mặc định / người dùng chuyển vùng / người dùng-cục bộ.)

Mất các thuộc tính tĩnh có nghĩa là tất cả các mã cần phải biết về cấu hình khác nhau.


Điều này yêu cầu toàn bộ tệp cấu hình được tải. Tôi chỉ cần appSettings & connectionStrings giống nhau, phần còn lại của tệp là khác nhau cho mỗi ứng dụng nên nó không giải quyết được vấn đề.
Robert MacLean 20/02/09

Toàn bộ cấu hình được tải bởi các thuộc tính bình thường (tĩnh) nên điều này không tạo ra sự khác biệt thực sự.
Richard

Ngoài ra, bạn chỉ có thể sử dụng định dạng XML của riêng mình và thêm tên của nó vào tệp cấu hình của ứng dụng và đọc trực tiếp.
Richard

5

Trong trường hợp chuỗi kết nối, thực sự có thể trỏ đến một tệp được chia sẻ. Nếu tệp được chia sẻ nằm trên UNC mạng, tệp đó yêu cầu đặc quyền quản trị trên máy nơi ứng dụng sẽ được lưu trữ.

Giải pháp: Trong web.config của bạn, sử dụng configSource để trỏ đến tệp cấu hình cục bộ. Do các hạn chế của .Net, điều này phải bằng hoặc thấp hơn cấp của tệp cấu hình gốc. Tôi chỉ trỏ đến một tệp trong chính thư mục ứng dụng:

<connectionStrings configSource="ConnectionStrings.config" />

Ở vị trí được chia sẻ mà người dùng nhóm ứng dụng có thể truy cập, hãy thêm tệp cấu hình chứa các chuỗi kết nối được chia sẻ. Tệp này không được chứa bất kỳ xml nào ngoài phần connectionStrings. Tệp được chia sẻ, ConnectionStrings.config, trông giống như sau:

<connectionStrings>
    <clear/>
    <add name="connString1" connectionString="connString1 info goes here"/>
    <add name="connString2" connectionString="connString2 info goes here"/>
</connectionStrings>  

Bây giờ là mẹo. Tạo một liên kết tượng trưng của Windows trong thư mục ứng dụng của bạn trỏ đến tệp cấu hình được chia sẻ bên ngoài. Bạn sẽ cần các đặc quyền của quản trị viên để thực hiện việc này:

mklink ConnectionStrings.config \\someServer\someShare\someFolder\ConnectionStrings.config

Chúng tôi vừa vượt qua .Net. Hệ thống cấu hình sẽ sử dụng cài đặt configSource để tìm các chuỗi kết nối trong tệp cục bộ có tên là ConnectionStrings.config. Liên kết tượng trưng trông giống như một tệp tới .Net và liên kết tượng trưng phân giải thành tệp cấu hình được chia sẻ.

Lưu ý: Các thay đổi đối với tệp được chia sẻ không tự động kích hoạt khởi động lại ứng dụng trong .Net. Trong trường hợp IIS, trang web hoặc nhóm ứng dụng sẽ cần được khởi động lại theo cách thủ công.

Do cần có đặc quyền quản trị để tạo liên kết tượng trưng, ​​cách tiếp cận này có thể không phù hợp với tất cả mọi người. Có hai lựa chọn thay thế liên quan có thể hoạt động nếu tệp được chia sẻ nằm trên cùng một ổ đĩa logic - liên kết cứng và các mối nối. Xem thảo luận nàythảo luận này để biết thêm thông tin.


3

Bạn có thể đặt cả hai cài đặt trong machine.config và sau đó chúng có sẵn cho tất cả các ứng dụng của bạn trên máy chủ.


Đó là một tùy chọn nhưng tôi không muốn (cần) các cài đặt có sẵn cho các ứng dụng khác trên máy. Lo lắng là các chuỗi kết nối, chúng có tên khá chung chung có thể xung đột với các ứng dụng khác.
Robert MacLean 20/02/09

2

Giải pháp mà tôi thấy hoạt động tốt nhất là đặt các tệp cấu hình "được chia sẻ" vào tệp trung tâm và sau đó sử dụng sự kiện tạo trước trong Visual Studio để sao chép chúng vào một thư mục tương đối của mỗi dự án cần nó.


2

Tôi đã gặp khó khăn với vấn đề này, nhưng tôi đã tìm thấy một giải pháp tốt cho nó ở đây: chạy thử nghiệm với cấu hình bên ngoài

(Bạn có thể hướng quá trình chạy thử nghiệm để sao chép các tệp và thư mục vào thư mục chạy thử nghiệm bằng cách chỉnh sửa tệp .testrunconfig.)

Mặc dù tại sao dự án loại thử nghiệm đơn vị có thể nhận cài đặt cấu hình từ app.config của chính nó, nhưng không thể tải các tệp cấu hình được tham chiếu như một app.config thông thường là một điều khó hiểu đối với tôi. Tôi gọi nó là một lỗi vì bạn sẽ mong đợi một app.config của dự án thử nghiệm sẽ hoạt động giống như cách mà app.config của ứng dụng hoạt động, nhưng nó không.


1

Bạn có thể sử dụng filethuộc tính thay vìconfigSource

Có một bài báo hay ở đây về nó

Điều này cho phép bạn chỉ định một đường dẫn tương đối như vậy

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings file="..\..\..\..\..\..\ExternalFile.config"></appSettings>
</configuration>

Đường dẫn có liên quan đến thư mục đầu ra.

Sau đó, trong ExternalFile.config, bạn chỉ cần thêm appSettingsphần

<appSettings>
    <add key="SomeKey" value="alue"/>
</appSettings>
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.