يمكن إضافة ConnectionStrings إلى ConnectionStringCollection في وقت التشغيل?

StackOverflow https://stackoverflow.com/questions/357465

سؤال

هل هناك طريقة حيث يمكن إضافة سلسلة اتصال إلى ConnectionStringCollection عاد قبل ConfigurationManager في وقت التشغيل في Asp.Net التطبيق ؟

لقد حاولت التالية ولكن أنا قلت أن تكوين الملف للقراءة فقط.

ConfigurationManager.ConnectionStrings.Add(new ConnectionStringSettings(params));

هل هناك طريقة أخرى للقيام بذلك في وقت التشغيل?أنا أعرف في وقت التصميم يمكنني إضافة سلسلة اتصال إلى شبكة الإنترنت.التكوين;ومع ذلك أبحث عن إضافة شيء إلى أن جمع في وقت التشغيل.

شكرا

تحرير:أحد الأسباب لماذا أنا أحاول فعل هذا ومن المقرر أن الأمن شرط أن يمنعني من وضع ConnectionStrings في شبكة الإنترنت.التكوين (حتى مشفرة).وأود أن استخدام عناصر مثل عضوية وملامح على المشروع ؛ ومع ذلك, أنا أبحث عن بديل القيام بمثل هذه w/o كتابة مخصص مزود.مخصص مزود ليست كلها سيئة ، ولكن إذا كان يمكن أن أجد الحل الأسهل ، أنا كل ذلك.

هل كانت مفيدة؟

المحلول

var cfg = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(@"/");
cfg.ConnectionStrings.ConnectionStrings.Add(new ConnectionStringSettings(params));

cfg.Save();

وينصح هذا سوف يسبب موقع الويب الخاص بك لإعادة تدوير لأنه يعدل ملف التكوين. تحقق من http://msdn.microsoft.com/en -US / مكتبة / 4c2kcht0 (VS.80) .aspx اتصال

نصائح أخرى

يمكنك استخدام انعكاس لتعطيل خاصة bReadOnly مجال (فكرة سيئة ، إلخ.):

typeof(ConfigurationElementCollection)
    .GetField("bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic)
    .SetValue(ConfigurationManager.ConnectionStrings, false);
ConfigurationManager.ConnectionStrings.Add(new ConnectionStringSettings());

تشبه هذه التقنية المطلوبة تعديل سلسلة الاتصال الموجودة, و إضافة التعليق هناك من قبل بريان روجرز.

وفقط أن نشير إلى كل من قدم لك "المتطلبات الأمنية" التي لا يمكنك وضع سلسلة الاتصال في الملف web.config هو احمق. في الملف web.config لا يمكن الوصول إليها من قبل أي شيء آخر من التطبيق الخاص بك أو الوصول عن بعد إلى الملقم.

وهذا يبدو تماما مثل مشكلة المتطلبات ويجب أن تحل هناك.

إذا كنت تحاول تعديل سلاسل اتصال في الملف web.config في وقت التشغيل نلقي نظرة على الموقع WebConfigurationManager .

إذا كنت مجرد محاولة لتعديل تكوين في وقت لحقن سلسلة اتصال فأنت من الحظ. ويعني الشجرة كائن ConfigurationManager أن يكون انعكاسا مباشرا للملفات التكوين، إذا كنت قادرا على تغيير أن الدولة ستكون ثم غير متناسقة.

وأوصي خلق طبقة واجهة بسيطة التي يمكن استخدامها لاسترداد سلاسل اتصال بك. بهذه الطريقة هل يمكن أن يكون واجهة بإرجاع سلسلة الاتصال من هاتفك على جمع ذبابة أو إذا كان أحد لا وجود له فلا يمكن الاستيلاء عليها من ConfigurationManager.

class ConnectionStringProvider
{
    Dictionary<string, System.Configuration.ConnectionStringSettings> _localStrings = new Dictionary<string, System.Configuration.ConnectionStringSettings>();

    public void AddLocalConnectionString(string name, string connstring)
    {
        System.Configuration.ConnectionStringSettings cs = new System.Configuration.ConnectionStringSettings(name, connstring);
        _localStrings.Add(name, cs);
    }

    public void RemoveLocalConnectionString(string name)
    {
        _localStrings.Remove(name);
    }

    public System.Configuration.ConnectionStringSettings this[string name] {
        get 
        { 
            return _localStrings.ContainsKey(name) ? _localStrings[name] : System.Configuration.ConfigurationManager.ConnectionStrings[name]; 
        }
    }
}

وأو هل يمكن أن تذهب دائما أثقل قليلا جدا، واستخدام ما يشبه كتلة تكوين مكتبة المؤسسة.

ولم يحاكم حتى الآن، ولكن ربما يمكنك تغيير قيمة سلسلة اتصال موجود في وقت التشغيل؟ على سبيل المثال، بدلا من:

ConfigurationManager.ConnectionStrings.Add(new ConnectionStringSettings(params));

وربما يمكن أن تفعل شيئا مثل:

ConfigurationManager.ConnectionStrings["myconnection"].ConnectionString = "something";

وإذا كان الأمر كذلك، هل يمكن تحديد سلسلة اتصال "المتغيرات" في التكوين، ولكن مجموعة منهم لسلاسل اتصال كاذبة أو فارغة:

<add name="myconnection" connectionString="SET AT RUNTIME" ... />

والبنية التحتية التكوين تدعم التشفير قوي جدا من خلال اللي تبونه ويندوز API DataProtection يستخدم مفتاح معين آلة لتشفير مقاطع التكوين. بهذه الطريقة لن يكون من الممكن قراءة البيانات المشفرة في أي مكان ولكن على الجهاز حيث تم تشفيرها.

وهذا هو نفس API الذي يتم استخدامه لتشفير متوافقة مع محرك / مجلد الحكومة في ويندوز. وهذا من شأنه الوقوف على متطلبات أمن الشركات الخاصة بك؟

وإما يدويا أو من خلال أتمتة النشر الخاصة بك يمكنك تنفيذ هذا الأمر لتشفير قسم connectionStrings من الملف web.config للحصول على تطبيق ويب معين.

aspnet_regiis -pe "connectionStrings" -app "/MyCoolWebApplication" -prov "DataProtectionConfigurationProvider"

إذا كنت تستخدم MS SQL يمكنك تكوين لك الخادم على شبكة الإنترنت للوصول إلى SQL Server عبر المصادقة ويندوز، لذلك لا يكون لديك أي كلمات مرور على الاطلاق في webconfig الخاص بك، أو حتى تطوف في الذاكرة التطبيق الخاص بك.

لا، لا يمكنك تعديل ملف التكوين في وقت التشغيل، فإنه لا يقصد به لذلك. ربما يمكنك استخدام تكوين المكتبات المؤسسة للقيام بذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top