2009-02-20 40 views
73

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

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

Đó tuy nhiên không thành công với một lỗi:

The configSource attribute is invalid.: The configSource 'D:\appSettings.config' is invalid. It must refer to a file in the same directory or in a subdirectory as the configuration file.

Liệu có cách nào để vẫn sử dụng các nhà quản lý cấu hình appSettings/connectionStrings và nhận các giá trị từ một vị trí bên ngoài?
Tôi rất vui vì 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 quản lý cấu hình.

Trả lời

85

Một giải pháp khác là chỉ cần thêm tệp cấu hình vào 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 dự án của bạn. Sau đó thiết lập "Build Action" của file thành "Content" và "Copy to Output Directory" thành "Copy if newer" và khi bạn biên dịch dự án, bạn sẽ có file 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ó nút Thêm có trình đơn thả xuống. Chọn "Thêm làm liên kết" từ trình đơn thả xuống trên nút Thêm để hoàn tất quy trình.

+0

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

+9

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 tôi (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 một "Không thể mở tập tin configSource 'db.config'" ngoại lệ. Có cái gì tôi đang mất tích để có thể làm điều này? Cảm ơn! – Funka

+13

Tất nhiên chỉ sau khi tôi quyết định chia nhỏ và gửi bình luận yêu cầu giúp đỡ, sau đó tôi tìm ra ngay sau đó. Tôi nhận thấy db.config của tôi là _also_ đượ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 vào đường dẫn này trong 'configSource' của nó và tất cả đều có vẻ tốt. Cảm ơn một lần nữa! – Funka

2

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ủ.

+0

Đó 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ó các tên khá chung chung có thể xung đột với các ứng dụng khác. –

7

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

Configuration myConfig = ConfigurationManager.OpenExeConfiguration(path) 

(Có một tình trạng quá tải cho phép file 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-địa phương.)

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

+0

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

+0

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

+0

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 các tệp cấu hình của ứng dụng và đọc nó trực tiếp. – Richard

16

Có vẻ như đó là cách thực hiện. configSource phải ở 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 chắn bạn nên, sử dụng liên kết cứng NTFS. [mad grin]

2

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

29

Dưới appSettings bạn có thể sử dụng file = thay vì configSource =

+1

Tuyệt vời tìm cho tôi! Cảm ơn!! Với điều này, tôi có thể ghi đè lên các phím chọn trong AppSettings như được hiển thị tại http://weblogs.asp.net/pwilson/archive/2003/04/09/5261.aspx –

2

tôi đã khá một cuộc đấu tranh 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: test run with external config

(Bạn có thể chỉ đạo việc chạy thử nghiệm để sao chép tệp và thư mục vào thư mục chạy thử 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 riêng của nó, nhưng không thể tải tệp cấu hình được tham chiếu như một app.config bình thường là loại khó hiểu với tôi. Tôi sẽ gọi nó là một lỗi vì bạn sẽ mong đợi một ứng dụng thử nghiệm dự án.config để hoạt động giống như cách app.config của ứng dụng hoạt động, nhưng nó không hoạt động.

3

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ì đây đã cho tôi cho bản thân mình những mặt cọ:

Khi bạn thêm a .config tệp vào dự án của bạn 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' hoặc 'Sao chép luôn', khi đó 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 định nghĩa trong Web.Config như thế này:

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

sau đó bạn phải xác định các yếu tố cấu hình có liên quan như thế này:

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

như vậy mà điểm configSource vào tập tin bin \ MySpecialConfig.config vật lý không liên kết Ngoài ra, lưu ý rằng đường dẫn là tương đối đường dẫn vật lý.

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

2

Trong trường hợp chuỗi kết nối, thực sự có thể trỏ đến tệp được chia sẻ. Nếu tệp được chia sẻ nằm trên mạng UNC, nó yêu cầu 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, hãy sử dụng configSource để trỏ đến tệp cấu hình cục bộ. Do hạn chế .Net, điều này phải bằng hoặc thấp hơn mức của tệp cấu hình gốc. Tôi chỉ trỏ đến một tệp trong thư mục ứng dụng:

<connectionStrings configSource="ConnectionStrings.config" /> 

Ở nơi dùng chung có thể truy cập bởi người dùng ứng dụng, thêm tệp cấu hình có chứa chuỗi kết nối được chia sẻ. Tệp này không được chứa bất kỳ xml nào khác 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ờ, hãy thử. Tạo một liên kết tượng trưng 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 quyền quản trị để thực hiện việc này:

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

Chúng tôi vừa thông minh hơn .Net. Hệ thống cấu hình sẽ sử dụng thiết lập configSource để tìm các chuỗi kết nối trong một tệp cục bộ được gọi 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 sẽ giải quyết tệp cấu hình được chia sẻ.

Cẩn thận: Thay đổi đối với tệp được chia sẻ không tự động kích hoạt ứng dụng khởi động lại .Net. Trong trường hợp của IIS, các trang web hoặc hồ bơi ứng dụng sẽ cần phải được khởi động lại bằng tay.

Do nhu cầu về đặ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 hoạt động đối với mọi người. Có hai lựa chọn thay thế có 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à nút nối. Xem this discussionthis discussion để biết thêm thông tin.

Các vấn đề liên quan