Elmah - ASP.NET -> سلاسل اتصال متعددة -> تعيين سلسلة اتصال سجل أخطاء SQL في التعليمات البرمجية

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

سؤال

أنا أتطلع إلى التكامل إلماه في تطبيق ASP.NET موجود لتقديم المزيد من الدعم لعمليات التحقق من الأخطاء ويمكن استخدام بعض المساعدة في سلاسل الاتصال.نحن نستخدم ملف web.config واحدًا لجميع البيئات أو البيئات التي يتم نشر التطبيق فيها، وفي وقت التشغيل، يقرر التطبيق البيئة التي يوجد بها، استنادًا عادةً إلى عنوان URL.

هذا ما تريده الكتلة القياسية بالنسبة لنا ...

  <connectionStrings>
    <add name="TESTAppDB" connectionString="Data Source=SQL-T-APPNAME.COMPANY.COM;Initial Catalog=APPNAME;User ID=USER;Password=THEPASS" providerName="System.Data.SqlClient"/>
    <add name="CERTAppDB" connectionString="Data Source=SQL-C-APPNAME.COMPANY.COM;Initial Catalog=APPNAME;User ID=USER;Password=THEPASS" providerName="System.Data.SqlClient"/>
    <add name="PRODAppDB" connectionString="Data Source=SQL-P-APPNAME.COMPANY.COM;Initial Catalog=APPNAME;User ID=USER;Password=THEPASS" providerName="System.Data.SqlClient"/>
  </connectionStrings>

مع Elmah، يبدو أنك تحتاج فقط إلى تحديد اسم سلسلة الاتصال، ولكن كيف يمكنني القيام بذلك ديناميكيًا في وقت التشغيل؟على سبيل المثال، إذا كنت اختبارًا، فأنا أريد هذا:

<elmah>
     <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="TESTAppDB"/>
</elmah>

ولكن إذا كنت في PROD:

<elmah>
     <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="PRODAppDB"/>
</elmah>

يحرر
ممارسات النشر لتطبيقات الويب خارج نطاق ما أحاول القيام به.أحتاج إلى حل كود يسمح لي بتغيير مصدر البيانات لسجل أخطاء ELMAH Sql...

لا أستطيع تغيير الطريقة التي ننشر بها تطبيقات الويب اليوم.وهذا يعني أن كل ما هو موجود في الاختبار، ينتقل إلى CERT.ما هو موجود في CERT ينتقل إلى PROD.يجب أن يكون تطبيق الويب قادرًا على تحديد البيئة الموجودة فيه وتشغيله على هذا النحو...

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

المحلول

نظرًا لأن Elmah مفتوح المصدر، سيكون من السهل إضافة ما تريد :-)

كل ما عليك فعله هو إضافة خاصية ثابتة جديدة إلى ملف SqlErrorLog فئة تحتوي على سلسلة الاتصال التي تريد استخدامها ثم تقوم بتحديث ملف SqlErrorLog.ConnectionString الخاصية لإرجاع سلسلة الاتصال المخصصة الخاصة بك إذا كانت تحتوي على قيمة.

حاول إضافة شيء مثل هذا إلى الفصل (تحذير - رمز لم يتم اختباره):

public static string CustomConnectionString { get; set; }

public virtual string ConnectionString
{
  get 
  { 
    if (string.IsNullOrEmpty(CustomConnectionString)) 
    {
      return _connectionString;
    }
    else
    {
      return CustomConnectionString; 
    }
  }
}

هذا ينبغي أن يكون كافيا.الآن كل ما عليك فعله هو العثور على الموقع الذي حددت فيه سلسلة الاتصال الخاصة بك وتحديثه لتعيين سلسلة الاتصال أيضًا SqlErrorLog.CustomConnectionString ملكية.

نصائح أخرى

أستخدم مشروع نشر الويب لهذا الغرض.يمكنك تحديد ملف يحتوي على سلسلة الاتصال لكل تكوين (التصحيح والإصدار بشكل افتراضي).بهذه الطريقة، تحتوي جميع ملفات التكوين الخاصة بك لجميع عمليات النشر على نفس الملفات ويتم تحديث web.config الخاص بك بشكل مناسب لكل عملية نشر.

لدى سكوت جو معلومات جيدة هنا: http://weblogs.asp.net/scottgu/archive/2005/11/06/429723.aspx

إنه لإصدار سابق ولكن المعلومات لا تزال سارية.

سأستخدم اسمًا واحدًا لسلسلة اتصال "AppDB"، ولكن في الواقع أستضيف سلسلة الاتصال في ملف تكوين خارجي (خارج ملف web.config)، يختلف في كل بيئة.

في web.config الخاص بك:

<connectionStrings configSource="config\connectionStrings.config"/>

ثم، في ملف ConnectionStrings.config:

<connectionStrings>    
    <add name="AppDB" connectionString="Data Source=SQL-T-APPNAME.COMPANY.COM;Initial Catalog=APPNAME;User ID=USER;Password=THEPASS" providerName="System.Data.SqlClient"/>
</connectionStrings>

ثم، اعتمادًا على البيئة التي يوجد بها ملف ConnectionStrings.config، قم بتعديل سلسلة الاتصال.في الكود، ما عليك سوى الرجوع إلى "AppDB".

للبناء على إجابة Rune Grimstad، بالإضافة إلى تغييراته، أضف:

if (connectionString.Length == 0)
    connectionString = CustomConnectionString;

بعد:

string connectionString = ConnectionStringHelper.GetConnectionString(config);

في مُنشئ SqlErrorLog (IDictionary config).

ثم فعلت ما فعله Rsolberg، ولكن في application_start بدلاً من الجلسة:

Elmah.SqlErrorLog.CustomConnectionString = "CS الخاص بك";

هل يمكننا استخدام سياق قاعدة البيانات في هذه الحالة؟

لدي تطبيق ويب في MVC 3 وأتصل بقاعدة البيانات باستخدام سياق قاعدة البيانات (وفقًا للمثال أعلاه):

using (var ctx = new TESTAppDB())
{
    var res = (from p in ctx.Customer select p).FirstOrDefault();
}

حيث TESTAppDB:

public class TESTAppDB: DbContext
{
    public DbSet<Customer> Customer{ get; set; }
}

إذا أردت الاتصال بقاعدة بيانات أخرى، أكتب:

using (var ctx = new CERTAppDB())
{
    var res = (from p in ctx.Order select p).FirstOrDefault();
}

يبدو أن الأمر صحيح ...

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