PDA

View Full Version : سوال: اعمال تغییر در App.Conf



NasimBamdad
سه شنبه 15 فروردین 1391, 18:30 عصر
سلام .

من یک نرم افزار دارم که به SQL وصل میشه و Connection String من در App.Conf ذخیره شده است .

حالا می خواهم یک صفحه تنظیمات در برنامه بزارم که کاربر بتوانید این کانکشن استرینگ که شامل ،

اسم دیتابیس ، یوزر و پسورد و آدرس سرور و ... هست رو تغییر بده . در واقع دستوری رو می خواهم که از C# بشه اون مقدار رو تغییر داد و در Application Config ذخیره کنه .

mohammad kafiyan
سه شنبه 15 فروردین 1391, 23:25 عصر
سلام دوست عزیز از
App.Confاستفاده نکن به جای اون از فایل ini.(فایل text )و یا xml استفاده کن بهتره یک جستجوی بکنی کار با xml و فایل text وجود داره

merlin_vista
سه شنبه 15 فروردین 1391, 23:42 عصر
@mohammad kafiyan (http://barnamenevis.org/member.php?109327-mohammad-kafiyan)
میشه دلیل استفاده نکردن از app Config را بگی ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

p.yazdkhasti
چهارشنبه 16 فروردین 1391, 00:10 صبح
سلام
من با دوستمون کاملا مخالفم. در دات نت به Assembly با نام System.Configuration یک Refrence دهید و سپس از کد زیر استفاده کنید.

var config = ConfigurationManager.OpenExeConfiguration(Configur ationUserLevel.None);
var conName = "MyConnectionToSqlServer";
ConnectionStringSettings con = null;
if (null != (con = config.ConnectionStrings.ConnectionStrings[conName]))
{
con.ConnectionString = "Data Source=TestDB;Initial Cataloge=Test;User ID =TestUser;Password=Pass";
config.Save(ConfigurationSaveMode.Modified);
}

در استفاده از این کد به نکات زیر دقت کنید:
1- در کد خود باید Namespace مربوطه را Import نمایید.

using System.Configuration;

2- در صورتی که این کد را در یک نرم افزار Windows Application و یا Console Application تست می کنید باید برای دیدن نتایج اجرای کد نرم افزار را بعد از Build شدن به صورت مستقیم در محلی که نتیجه Build قرار دارد اجرا نمایید و نتیجه را در فایل Config موجود در همان محل مشاهده کنید.
3- این کد در نرم افزار های تحت وب نیز قابل استفاده است.
4- فایل Config نمونه برای این کد به صورت زیر است:

<configuration>
<connectionStrings>
<add name="MyConnectionToSqlServer" connectionString="TextToChange"/>
</connectionStrings>
</configuration>

NasimBamdad
پنج شنبه 17 فروردین 1391, 14:15 عصر
سلام دوست عزیز از
App.Confاستفاده نکن به جای اون از فایل ini.(فایل text )و یا xml استفاده کن بهتره یک جستجوی بکنی کار با xml و فایل text وجود داره


به نظر من امنیت app.conf بیشتر از فایل .ini و یا xml است .

NasimBamdad
پنج شنبه 17 فروردین 1391, 17:00 عصر
سلام
من با دوستمون کاملا مخالفم. در دات نت به Assembly با نام System.Configuration یک Refrence دهید و سپس از کد زیر استفاده کنید.

var config = ConfigurationManager.OpenExeConfiguration(Configur ationUserLevel.None);
var conName = "MyConnectionToSqlServer";
ConnectionStringSettings con = null;
if (null != (con = config.ConnectionStrings.ConnectionStrings[conName]))
{
con.ConnectionString = "Data Source=TestDB;Initial Cataloge=Test;User ID =TestUser;Password=Pass";
config.Save(ConfigurationSaveMode.Modified);
}

در استفاده از این کد به نکات زیر دقت کنید:
1- در کد خود باید Namespace مربوطه را Import نمایید.

using System.Configuration;

2- در صورتی که این کد را در یک نرم افزار Windows Application و یا Console Application تست می کنید باید برای دیدن نتایج اجرای کد نرم افزار را بعد از Build شدن به صورت مستقیم در محلی که نتیجه Build قرار دارد اجرا نمایید و نتیجه را در فایل Config موجود در همان محل مشاهده کنید.
3- این کد در نرم افزار های تحت وب نیز قابل استفاده است.
4- فایل Config نمونه برای این کد به صورت زیر است:

<configuration>
<connectionStrings>
<add name="MyConnectionToSqlServer" connectionString="TextToChange"/>
</connectionStrings>
</configuration>



از روش شما استفاده کردم و خیلی خوب کار کرد ، شبه کد زیر رو هم دارم که کار کد شما رو انجام میده


System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(Configur ationUserLevel.None);
config.AppSettings.Settings.Remove("ConnectionString");
config.AppSettings.Settings.Add("ConnectionString", "Data Source=XP-7,1433;Initial Catalog=NoorAutomation;Integrated Security=True");
config.Save(ConfigurationSaveMode.Full);
ConfigurationManager.RefreshSection("appSettings");


اما مشکل اینجا است که تغییرات در app .conf اعمال نمیشه . ، یعنی تنظیمات سایق رو داره . چی طوری باید refresh کرد ؟

mohammad kafiyan
جمعه 18 فروردین 1391, 00:27 صبح
سلام به دوستان من هم قبلا برای ذخیره از فایل app config می خواستم استفاده کنم ولی با مشورت دوستمون Esmail Solhkhah (http://barnamenevis.org/member.php?27551-Esmail-Solhkhah) این در انتهای تایپیک راه را پیشنهاد کرده اند(مطالعه کنید) و من استفاده می کنم و مشکلی تا به حال نبوده

[/URL]http://barnamenevis.org/showthread.php?178392-***%D8%A7%D9%85%D9%88%D8%B2%D8%B4-%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%D8%A7%D9%86%D9%88%D8%A7%D8%B9-%DA%A9%D8%A7%D9%86%DA%A9%D8%B4%D9%86-%D8%A7%D8%B3%D8%AA%D8%B1%DB%8C%D9%86%DA%AF***/page3&highlight=app (http://barnamenevis.org/showthread.php?178392-***%D8%A7%D9%85%D9%88%D8%B2%D8%B4-%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%D8%A7%D9%86%D9%88%D8%A7%D8%B9-%DA%A9%D8%A7%D9%86%DA%A9%D8%B4%D9%86-%D8%A7%D8%B3%D8%AA%D8%B1%DB%8C%D9%86%DA%AF***/page3&highlight=app)

نمونه دیگر

[URL]http://barnamenevis.org/showthread.php?314495-%D9%85%D8%B4%DA%A9%D9%84-%D8%AF%D8%B1-%D8%AD%D9%81%D8%A7%D8%B8%D8%AA-%D8%A7%D8%B2-app.config&highlight=app+config
حالا چرا فایل app config امنیتش از xml ,text بیشتره ؟؟؟؟؟؟
توضیح بدهید یاد می گیریم:لبخندساده:

p.yazdkhasti
جمعه 18 فروردین 1391, 01:32 صبح
از روش شما استفاده کردم و خیلی خوب کار کرد ، شبه کد زیر رو هم دارم که کار کد شما رو انجام میده


System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(Configur ationUserLevel.None);
config.AppSettings.Settings.Remove("ConnectionString");
config.AppSettings.Settings.Add("ConnectionString", "Data Source=XP-7,1433;Initial Catalog=NoorAutomation;Integrated Security=True");
config.Save(ConfigurationSaveMode.Full);
ConfigurationManager.RefreshSection("appSettings");


اما مشکل اینجا است که تغییرات در app .conf اعمال نمیشه . ، یعنی تنظیمات سایق رو داره . چی طوری باید refresh کرد ؟

سلام
همان طور که در نکات گفتم شما نمی توانید آن را در محیط Debug محیط VS تست کنید. ابتدا لازم است پروژه را Build نمایید سپس برای اطمینان از این که اشتباه نمی کنید VS را ببندید. سپس در فولدری که EXE پروژه خود را قرار داده اید بر روی EXE کلیک کنید و نتیجه را تست کنید. دلیل اینکه نتیجه را در محیط Debug نمی بینید این است که شما در حقیقت فایل App.config که در محیط Debug کد شما آن را تغییر می دهد باز نمی کنید و فایل App.Config موجود در Visual Studio که یک فایل دیگر است را مشاهده می کنید. این یکی از بهترین روش ها برای این کار است و با روش های ذکر شده توسط دیگران که از App.Config استفاده نشود مخالفم مگر این که دلیل خاصی داشته باشد.

NasimBamdad
شنبه 19 فروردین 1391, 13:11 عصر
حالا چرا فایل app config امنیتش از xml ,text بیشتره ؟؟؟؟؟؟
توضیح بدهید یاد می گیریم

والا من احساس می کنم که چون ماله خود VS هست و با VS تولید میشه و اینکه زمانی که برنامه رو نصب می کنیم دیگه app.conf دیده نمیشه ، پس امنیتش بیشتره .

حالا درست و یا غلط رو دوستان تشخیص بدند . من این طوری احساس می کنم .

p.yazdkhasti
شنبه 19 فروردین 1391, 23:47 عصر
سلام
شما می توانید در هر دو روش به صورت امن اطلاعات خود را ذخیره نمایید. ولی با توجه به اینکه فایل Configuration و کتابخانه مرتبط با آن به همین منظور توسط .net framework ارائه شده است دلیلی برای استفاده از راه حل های دیگر در بیشتر موارد وجود ندارد و تنها زمان و هزینه را بالا می برد و نرم افزار را پیچیده تر خواهد کرد.

mohammad kafiyan
شنبه 19 فروردین 1391, 23:50 عصر
اینکه زمانی که برنامه رو نصب می کنیم دیگه app.conf دیده نمیشه

بیشتر توضیح دهید
یعنی زمانی که setup می سازی فایل ap.configقابل رویت نیست آیا این کاررا انجام دادید ؟؟؟
آیا امکان دسترسی به این فایل به صورت دستی وجود نداره؟؟؟؟

p.yazdkhasti
یک شنبه 20 فروردین 1391, 09:52 صبح
سلام
شما با استفاده از هر دو روش یعنی استفاده از App.Config و یا فایل متنی برای ذخیره سازی اطلاعات Connection String در صورتی که می خواهید اطلاعات توسط افراد دیگر قابل خواندن نباشد لازم است آن اطلاعات را Encrypt و در نرم افزار خود Decrypt نمایید. البته بهترین روش Authentication برای ارتباط با پایگاه داده (در صورت امکان) استفاده از Windows Authentication است. در این روش مشاهده Connection String توسط کاربر نیز مشکلی ایجاد نخواهد کرد.

NasimBamdad
یک شنبه 20 فروردین 1391, 18:19 عصر
بیشتر توضیح دهید
یعنی زمانی که setup می سازی فایل ap.configقابل رویت نیست آیا این کاررا انجام دادید ؟؟؟
آیا امکان دسترسی به این فایل به صورت دستی وجود نداره؟؟؟؟

بله ، بعد از اینکه با VS یک Setup ساختم و نرم افزار رو از طریق Installer نصب کردم ، دیگه app.conf در بین فایل هام نیست

NasimBamdad
یک شنبه 20 فروردین 1391, 18:21 عصر
سلام
شما با استفاده از هر دو روش یعنی استفاده از App.Config و یا فایل متنی برای ذخیره سازی اطلاعات Connection String در صورتی که می خواهید اطلاعات توسط افراد دیگر قابل خواندن نباشد لازم است آن اطلاعات را Encrypt و در نرم افزار خود Decrypt نمایید. البته بهترین روش Authentication برای ارتباط با پایگاه داده (در صورت امکان) استفاده از Windows Authentication است. در این روش مشاهده Connection String توسط کاربر نیز مشکلی ایجاد نخواهد کرد.


یعنی از نظر مت اگه من با مثلا MD5 بیام Encrypt کنم ، امنیت بیشتر یا برابر با خود APP.CONF هست ؟ . از لحاظ امنیتی شما کدوم رو پیشنهاد می کنید .

بعد از نظر سرعت چی ؟ از APP.CONF سرعت بیشتری داره یا از یک فایل .ini ؟

به نظر شما استفاده از StreamReader و StreamWriter برنامه رو سنگین تر و کند تر نمی کنه ؟ ( برای خواندن فایل تنظیمات )

بعد به نظر شما اگه user , Pass برای کانکشن استرینگ تعریف کنیم بهتر هست و امنیت بیشتر یا Windows Authentication ???

شما نرم افزار رو تحت شبکه در نظر بگیرید که 20 تا 100 تا کلاینت قرار هست باهاش کار کنه !

vahidpur
دوشنبه 21 فروردین 1391, 09:35 صبح
از نظر سرعت كه جاي بحث ندارن چون فقط يه بار موقع استارت برنامه لازمه خونده بشه

از نظر امنيت هم بهتره كه كاربر ها در خود ديتا بيس تعريف بشن تا همه كنترلها دست خودش باشه

با اين روش فقط كافيه اسم سرور و اسم ديتا بيس تو App.Con ذخيره بشه