سؤال

أواجه مشكلة مع أحد سلسلة اتصال ASP.NET 2.0. هناك حالات أن أحصل على لم يتم تهيئة ملكية ConnectionString المشكلة التي تحدث بشكل عشوائي وغير متقطع ودون أي سبب.

تتوفر سلسلة الاتصال الخاصة بي بالفعل من موقع Webservice، لأن أنواع مختلفة من المستخدمين يتم تزويدها بمجموعات مختلفة من سلسلة الاتصال اعتمادا على مستوى المستخدم الخاص بهم.

ما فعلته حتى الآن يذهب مثل هذا:

لدي صفحة رئيسية (mstr.page) والرمز المقابل وراء (mstr.page.vb).

في صفحتي الرئيسية، أسترجع في البداية سلسلة الاتصال وتخزينها نفسها في متغير الجلسة، أي

Session("ConnString") = "RetrievedConnectionString"

الآن في واحدة من صفحاتي، دعونا نقول page1.aspx.vb, ، أستخدم وظائف مشتركة عامة من فئة (اسمه MyClass.vb) واستخدامها في بلدي page1.aspx.vb.

بعض الرموز للرجوع إليها:

[MyClass.vb]
Imports System.Web

NameSpace ClassNameSpace
  Public Class Admin
    Protected Shared da as New DataAccess()

    Public Shared Function MYFunction() as String
      'Execute some sql statements here, using the DataAccess
      stringToReturn = Ctype(da.ExecuteScalar("SQLCommand"), String)
      Return stringToReturn
    End Function
  End Class
End NameSpace

[DataAccessClass.vb]
Public Class DataAccess()
  Private m_ConStr As String = ""

  Public Sub New()
    m_ConStr = HttpContext.Current.Session("ConnString")
  End Sub

  'Some methods for SQL statement execution (ExecuteQuery, ExecuteScalar)
End Class

[Page1.aspx.vb]
Imports ClassNameSpace

Protected Sub Page_Load(....) Handles Me.Load
  Dim strValue as String = Admin.MyFunction()
End Sub

لقد وضعت الكود أعلاه لتظهر لك بعض الفكرة الخشنة حول كيف تسير الأمور.

أساسا، وظيفة Admin.MyFunction() في بعض الأحيان فشل، لأنه في فئة الوصول إلى البيانات، يبدو أن سلسلة الاتصال قد فقدت قيمةها (إما فارغة أو لا شيء).

هذا قد مضطربني لبعض الوقت بالفعل.

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

بالمناسبة، أنا أسترجع connectionstring في البداية عبر الصفحة الرئيسية من خدمة ويب. حاولت وضع نفس وظيفة استرداد في فئة الوصول إلى البيانات عند الظروف هي أن متغير الجلسة قد فقد، ولكن أعتقد أن تطبيقي لا يمكن الاتصال بخدمة الويب أثناء عملية إعادة التدوير.

سيتم تقدير أي نصيحة إلى حد كبير في هذا.

تحديث على هذا:

حاولت استخدام متغير الجلسة وتعيين الوضع إلى خادم الدولة، ولكن يبدو أن بعض DLLات التي أستخدمها لا يمكن أن تكون متسلسلة، وبالتالي أعود إلى المربع واحد.

هل هناك طريقة أفضل للقيام بذلك؟

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

المحلول

شيء واحد للتحقق هو إذا كانت جلستك تتسرب. إذا كنت تستخدم في جلسة (افتراضية) في الذاكرة، فإن الجلسات تموت في أي وقت يتم إعادة تدوير عملية عامل ASP.NET. إذا كان هذا يسبب مشكلتك، فقد تضطر إلى النظر في استخدام Sessionserver ASP.NET في IIS أو SQL Server كتخزين الجلسة الخاصة بك.

نصائح أخرى

سأحاول الحد من استخدامك للجلسة لهذا النوع من الأشياء قدر الإمكان. إذا كنت تستخدم Web.config لتخزين سلاسل الاتصال الخاصة بك، يمكنك الوصول إليها في أي وقت ولن تنتهي صلاحيتها إليك مثل الجلسة.

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

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

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

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

أود أن أضع خدمة الويب الخاصة بك وتطبيق الويب في تجمعات تطبيقات مختلفة. ثم قم بزيادة طول مهلة تجمع تطبيقات الويب الخاصة بك.

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