একটি স্বেচ্ছাসেবী অবস্থান থেকে কনফিগারেশন লোড করতে কনফিগারেশন ম্যানেজার ব্যবহার করে


124

আমি একটি ডেটা অ্যাক্সেস উপাদান বিকাশ করছি যা এমন কোনও ওয়েবসাইটে ব্যবহার করা হবে যাতে ক্লাসিক এএসপি এবং এএসপি.এনইটি পৃষ্ঠাগুলির মিশ্রণ রয়েছে এবং এর কনফিগারেশন সেটিংস পরিচালনা করার জন্য একটি ভাল উপায় প্রয়োজন need

আমি একটি কাস্টম ব্যবহার করতে চাই ConfigurationSectionএবং এএসপি.নেট পৃষ্ঠাগুলির জন্য এটি দুর্দান্ত কাজ করে। কিন্তু যখন উপাদানটি ক্লাসিক এএসপি পৃষ্ঠা থেকে COM ইন্টারপের মাধ্যমে কল করা হয়, তখন উপাদানটি একটি এএসপি.নেট অনুরোধের প্রেক্ষিতে চলমান না এবং তাই ওয়েবকনফিগের কোনও জ্ঞান নেই।

ConfigurationManagerকোনও সালিশী পথ থেকে কনফিগারেশনটি লোড করার কোনও উপায় আছে কি (উদাহরণস্বরূপ ..\web.configযদি আমার সমাবেশটি /binফোল্ডারে থাকে)? যদি সেখানে থাকে তবে আমি ভাবছি যে আমার কন্টেন্টটি যদি কাস্টম বিভাগের জন্য ডিফল্টরূপে ConfigurationManager.GetSectionফিরে আসে তবে আমি এতে ফিরে যেতে nullপারি।

এটির জন্য অন্য যে কোনও পদ্ধতির স্বাগত জানানো হবে!


উত্তর:


124

এটা চেষ্টা কর:

System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);

আমি কিভাবে পেতে পারেন প্রোগ্রামেটিক্যালি strConfigPath আমার ASP.NET জন্য মান ওয়েবফর্মগুলি অ্যাপ্লিকেশানে সঞ্চালিত sub.domain.com/virtualDir2 এবং পথ \ পোর্টাল \ App1 \ v2: সি এবং কনফিগ ফাইল মধ্যে সি: \ পোর্টাল \ App1 \ v2 \ web.config ?
কুইকিনেট

1
@ কুইকিনেট: প্রশ্নের মূল বক্তব্য হ'ল #ConfigPath একটি স্বেচ্ছাসেবী অবস্থান। অন্য কথায়, আপনি স্থিতিশীল অবস্থান থেকে কোনও কনফিগার ফাইল লোড করার চেষ্টা করার জন্য কাঠামোর উপর নির্ভর না করে পথটি কী তা স্থির করে নিন। আমি ধরে নেব সার্ভার.ম্যাপপথ আপনাকে আপনার সমাধানের মধ্যে যে কোনও ফাইলের জন্য পরম অবস্থান দেবে।
ইসমাeল

1
হতে পারেvar config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~/web.config");
কুইকিনেট

পছন্দ করুন
উচো

66

আর একটি সমাধান হ'ল ডিফল্ট পরিবেশ কনফিগারেশন ফাইল পাথকে ওভাররাইড করা।

অ-তুচ্ছ-পাথ কনফিগারেশন ফাইল লোডের জন্য আমি এটি সেরা সমাধান খুঁজে পেয়েছি, বিশেষত সেরা উপায় উপায়টি কনফিগারেশন ফাইলটি ডিএলএল সংযুক্ত করার জন্য।

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", <Full_Path_To_The_Configuration_File>);

উদাহরণ:

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"C:\Shared\app.config");

আরও বিশদ এই ব্লগে পাওয়া যাবে ।

তদ্ব্যতীত, এই অন্য উত্তরের একটি দুর্দান্ত সমাধান রয়েছে, অ্যাপ্লিকেশন কনফিগারেশাকে রিফ্রেশ করার কোড সহ এবং IDisposableএটির স্থিতিতে পুনরায় সেট করার জন্য কোনও অবজেক্ট। এই সমাধানের সাহায্যে আপনি অস্থায়ী অ্যাপ্লিকেশন কনফিগারেশনটি স্কোপড রাখতে পারেন:

using(AppConfig.Change(tempFileName))
{
    // tempFileName is used for the app config during this context
}

1
এটি ওয়েবকনফিগ ফাইলগুলি লোড করতেও কাজ করে। আমি কোনও টাস্ক সম্পর্কিত কনসোল অ্যাপ্লিকেশনটির জন্য app.config এর পরিবর্তে ওয়েবকনফিগটি লোড করতে এটি ব্যবহার করি। ;)
জেমস উইলকিন্স

1
এটি (এবং এখানে অন্যান্য উত্তরগুলি) আমার পক্ষে কাজ করে না। আমি প্রোগ্রামটি কোডগুলিতে যুক্ত করেছি .c ফাংশন: প্রধান ()। আমার কনফিগারেশনে একটি অ্যাসেম্বলি সংস্করণ পুনঃনির্দেশ রয়েছে (দেখুন স্ট্যাকওভারফ্লো / প্রশ্ন / 30165393/… ) তবে কনফিগারটি ম্যানুয়ালি পরিবর্তিত হলে পুনঃনির্দেশটি প্রভাবিত করে না।
ভেরটেক্স 852456

1
আপনি কি "APP_CONFIG_FILE" ব্যবহার করেছেন?
শনি টেকনোলজিস

40

ইসমাইলের উত্তরটি সাধারণত কাজ করে, তবে আমি একটি সমস্যা পেয়েছি, যা হ'ল মেশিন.কনফিগ OpenMappedMachineConfigurationথেকে আপনার উত্তরাধিকার সূত্রে বিভাগগুলি হারাতে পারে বলে মনে হচ্ছে। এর অর্থ হল আপনি নিজের কাস্টম বিভাগগুলি অ্যাক্সেস করতে পারবেন (যা সমস্ত ওপি চেয়েছিল), তবে সাধারণ সিস্টেম বিভাগগুলিতে নয়। উদাহরণস্বরূপ, এই কোডটি কাজ করবে না:

ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath);
Configuration configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup;  // returns null

মূলত, আপনি যদি একটি ঘড়ি রাখেন configuration.SectionGroups, আপনি দেখতে পাবেন যে system.net সেকশনগ্রুপ হিসাবে নিবন্ধভুক্ত নয়, তাই এটি সাধারণ চ্যানেলগুলির মাধ্যমে বেশ কিছুটা অ্যাক্সেসযোগ্য।

এটিকে ঘিরে কাজ করার দুটি উপায় রয়েছে। প্রথমটি, যা আমি পছন্দ করি না তা হ'ল মেশিন.কনফিগ থেকে আপনার নিজের ওয়েবকনফাইগে অনুলিপি করে সিস্টেম বিভাগের গ্রুপগুলি পুনরায় প্রয়োগ করা eg

<sectionGroup name="system.net" type="System.Net.Configuration.NetSectionGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
  <sectionGroup name="mailSettings" type="System.Net.Configuration.MailSettingsSectionGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <section name="smtp" type="System.Net.Configuration.SmtpSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </sectionGroup>
</sectionGroup>

আমি নিশ্চিত নই যে এর পরে ওয়েব অ্যাপ্লিকেশন নিজেই সঠিকভাবে চলবে তবে আপনি বিভাগটি সঠিকভাবে অ্যাক্সেস করতে পারবেন।

এটির পরিবর্তে দ্বিতীয় সমাধানটি আপনার ওয়েবকনফিগকে একটি এক্সইএইফাই কনফিগারেশন হিসাবে খোলার, যা সম্ভবত এটির উদ্দেশ্যযুক্ত ফাংশনের কাছাকাছি রয়েছে:

ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap() { ExeConfigFilename = strConfigPath };
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup;  // returns valid object!

আমি এখানে জবাব দেওয়ার সাহস করি না, আমার বা ইসমাইলের কেউই এই নেট ফাংশনটি ব্যবহার করছে না। নেট ডিজাইনাররা কীভাবে উদ্দেশ্য করেছিলেন। তবে, এটি আমার পক্ষে কাজ করে বলে মনে হচ্ছে।


1
আপনি একই উদ্দেশ্যে কনফিগারেশন ম্যানেজ.ওপেনএক্সে কনফিগারেশন (স্ট্রিং) ওভারলোড ব্যবহার করতে পারেন। দেখুন: কোডেপ্রজেক্ট
ওহাদ স্নাইডার

10

ইসমাইলের উত্তর ছাড়াও, পদ্ধতিটি OpenMappedMachineConfiguration()সর্বদা কোনও Configurationবস্তু ফিরিয়ে আনবে । সুতরাং এটি লোড হয়েছে কিনা তা পরীক্ষা করার জন্য আপনার সেই HasFileসম্পত্তিটি পরীক্ষা করা উচিত যেখানে আসল অর্থ এটি কোনও ফাইল থেকে এসেছে।


9

গৃহীত উত্তর ভুল!

এটি অ্যাপসেটেটিং সম্পত্তিটি অ্যাক্সেস করার ক্ষেত্রে নিম্নলিখিত ব্যতিক্রম ছুঁড়ে ফেলেছে:

'System.Configration.DefaultSication' টাইপ করতে 'System.Configration.appSettingsSication' টাইপ করার জন্য অক্ষম।

এখানে সঠিক সমাধান:

System.Configuration.ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = "YourFilePath";
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);

1
হ্যাঁ, এটি অবশ্যই সঠিক উত্তর! আপনার উত্তর পোস্ট করার জন্য ধন্যবাদ।
ফ্যাবিও মিলহিরো

আমি মনে করি System.Web.Configration.WebConfigrationManager.OpenWebConfigration আরও সঠিক তবে এটি NET কোরের জন্য উপলভ্য নয় সুতরাং সেক্ষেত্রে এই উত্তরটি কাজ শেষ হয়ে যায় বলে মনে হয়।
রিসর্ড

4

আমি নিম্নলিখিত শব্দ হিসাবে হোস্ট করা .NET সংমিশ্রণে কনফিগারেশন মানগুলি সরবরাহ করেছি।

একটি। নেট ক্লাস লাইব্রেরির উপাদান এমএস ওয়ার্ডে কল / হোস্ট করা হচ্ছে। আমার উপাদানটিতে কনফিগারেশন মানগুলি সরবরাহ করতে, আমি সি: \ প্রোগ্রাম ফাইলগুলি \ মাইক্রোসফ্ট অফিস \ অফিসিএল 11 ফোল্ডারে উইনওয়ার্ড.এক্সে.কনফিগ তৈরি করেছি। আপনি ট্র্যাডিশনাল। নেট এ যেমন করেন কনফিগারেশন মানগুলি পড়তে সক্ষম হওয়া উচিত।

string sMsg = System.Configuration.ConfigurationManager.AppSettings["WSURL"];

1

এএসপি.নেটের জন্য ওয়েব কনফিগারেশন ম্যানেজার ব্যবহার করুন:

var config = WebConfigurationManager.OpenWebConfiguration("~/Sites/" + requestDomain + "/");
(..)
config.AppSettings.Settings["xxxx"].Value;

0

এক্সএমএল প্রসেসিং ব্যবহার করুন:

var appPath = AppDomain.CurrentDomain.BaseDirectory;
var configPath = Path.Combine(appPath, baseFileName);;
var root = XElement.Load(configPath);

// can call root.Elements(...)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.