SqlClient المكالمات تسبب "الموضوع تم إحباط في SNINativeMethodWrapper.SNIPacketGetConnection(IntPtr حزم)"

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

سؤال

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

لدي قليلا من التعليمات البرمجية التي تولد صغيرة تقرير الملفات.لكل ملف في مجموعة تخزين proc يتم الحصول على البيانات عن طريق XML القارئ (لها كبيرة جدا نتيجة تعيين).عندما خلق كل هذا ، وصعدت من خلال ذلك ، كل شيء على ما يرام.يتم إنشاء ملفات أية أخطاء.

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

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

هذا يؤدي بي إلى الاعتقاد بأن ذلك تم إعداد مهلة أن المصحح هو الطاغي, فعلت بعض الخام توقيت العملية الشاملة (وليس قطعة واحدة من الفشل رمز) ويبدو أن تفشل على بعد حوالي 200 ثانية.شبكة الإنترنت.التكوين executionTimeout يتم تعيين 600 دقيقة (الكثير عالية بما فيه الكفاية).هناك أجزاء أخرى إلى هذا الملقم التطبيقات التي تتطلب COM+ المعاملات (2 دقيقة مهلة), ولكن ليس هذا هو واحد منهم.أنا في حيرة ما مهلة يمكن أن يكون ضرب (في حوالي 200 العلامة الثانية).

SQL مهلة الاتصال في الافتراضي (الاتصال يفتح بنجاح) ، الأمر مهلة 300 ثانية (يستغرق سوى 12-15 إلى exec الأمر).

  • هل هناك أي مهلة أنني يمكن أن يكون في عداد المفقودين ؟

ركضت منشئ ملفات التعريف SQL, وهذا يظهر أن يتم إرجاع النتيجة بشكل صحيح (جميع البيانات و RPC الانتهاء - عدم وجود أخطاء).تنفيذ التعليمات البرمجية عن طريق صواريخ أرض-أرض يوفر نتائج مثالية.

باستخدام عاكس, لقد حفر في SNINativeMethodWrapper ، مجمع على التعليمات البرمجية غير المدارة و أنا غير قادر على معرفة ما تحاول القيام به في الواقع.وأنا يمكن أن نفترض فقط (ربما خطأ) أن قانون تلقت TDS من SQL server و المجمع تحاول الحصول على اتصال المرتبطة الحزمة وأنه لا يمكن.

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

حاولت باستخدام طرق مختلفة (ExecScalar, DataAdapter) ، ولكنها جميعا استخدام ExecuteReader داخليا.

حاولت تعطيل تجمع الاتصال وإجبار العميل على استخدام نفس حجم حزمة الملقم.

  • هل لدى أي شخص أي أفكار ما يسبب هذا أم ماذا يمكنني أن أفعل لعزل ومحاولة لتصحيح المشكلة ؟

هذا هو كود الاتصال حيث يتم إنشاء استثناء.

Private Function GetDataAsXmlDoc(ByVal cmd As SqlClient.SqlCommand) As XmlDocument

    Dim _xmlDoc As XmlDocument

    Using _connection As New SqlClient.SqlConnection(GetConnectionString())

        Logging.DebugEvent.Raise(Me.GetType.Namespace, Reflection.MethodBase.GetCurrentMethod().Name, _
                                 "No cached data found or used. Getting data for report from the database using SQL connection.")

        Dim _xmlReader As XmlReader
        'DataAdapter,ExecuteScalar, ExecuteXmlReader all use ExecuteReader internally and suffer the same problem.'
        'If you dont believe me, reflect it or look at one of the blowed up stack traces. '

        '_connection.ConnectionString += ";Pooling=false;"' 'This has no effect on the ThreadAbort.'
        cmd.Connection = _connection
        cmd.CommandTimeout = 300
        _connection.Open()

        Logging.DebugEvent.Log(String.Format("Connection opened, using packet size of {0}.", _connection.PacketSize))

        _xmlReader = cmd.ExecuteXmlReader() 'Thread aborts in here'

        Logging.DebugEvent.Raise(Me.GetType.Namespace, Reflection.MethodBase.GetCurrentMethod().Name, _
                                 "Report data recieved from database")

        _xmlDoc = New XmlDocument()
        _xmlDoc.Load(_xmlReader)

        _xmlReader.Close()

    End Using

  Return _xmlDoc

End Function

المكدس

Exception String - System.Threading.ThreadAbortException: Thread was being aborted.
   at SNINativeMethodWrapper.SNIPacketGetConnection(IntPtr packet)
   at System.Data.SqlClient.TdsParserStateObject.ProcessSniPacket(IntPtr packet, UInt32 error)
   at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()
   at System.Data.SqlClient.TdsParserStateObject.ReadBuffer()
   at System.Data.SqlClient.TdsParserStateObject.ReadByte()
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteXmlReader()...
هل كانت مفيدة؟

المحلول

اعتقد تم حل المشكلة.المخالف سطر من التعليمات البرمجية في المثال أعلاه كان البيان...

 Logging.DebugEvent.Raise(Me.GetType.Namespace, Reflection.MethodBase.GetCurrentMethod().Name, _
                                 "Report data recieved from database")

هذه دعوة إلى تطبيق الكتلة (MS مكتبة المؤسسة) على تسجيل الأحداث إلى ملفات مسطحة (في هذه الحالة) أو سجلات الأحداث.

هذا واحد ، بين ExecuteXMLReader() و الاستخدام الفعلي القارئ في مستند XML ، وأحيانا عدم بقسوة ، مما تسبب في الموضوع كله أن تجهض.انتقلت الخط بعد _xmlReader.Close() و أخذت الرعاية من المشكلة.

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