Le chiamate SqlClient causano & # 8220; Il thread è stato interrotto in SNINativeMethodWrapper.SNIPacketGetConnection (pacchetto IntPtr) & # 8221;

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

Domanda

Gradirei davvero qualsiasi suggerimento, non importa quanto semplice o complesso, per aiutarmi a isolare e risolvere questo problema.

Ho un po 'di codice che genera piccoli file di report. Per ogni file nella raccolta, viene eseguito un proc memorizzato per ottenere i dati tramite il lettore XML (è un set di risultati piuttosto grande). Quando ho creato tutto questo e l'ho attraversato, tutto va bene. I file vengono generati, nessun errore.

Questa libreria viene chiamata tramite il telecomando ed è ospitata tramite IIS. Quando distribuisco la libreria compilata e la chiamo, è in grado di generare alcuni dei report, ma genera un'eccezione di interruzione del thread. Se allego il debugger al processo di lavoro ASP e passo attraverso il codice, non ho problemi.

Visto che questo fallimento è abbastanza coerente, ho cercato delle somiglianze e ho scoperto che l'errore si verifica su diversi rapporti, ma sembra accadere allo stesso punto cronologico.

Questo mi ha portato a pensare che era un'impostazione di timeout che il debugger sta scavalcando, ho fatto dei tempi approssimativi dell'intero processo (non il singolo pezzo di codice difettoso) e sembra fallire subito dopo circa 200 secondi. L'esecuzione di web.configTimeout è impostata per 600 minuti (abbastanza alto). Esistono altre parti di questa applicazione server che richiedono transazioni COM + (timeout di 2 minuti), ma questa non è una di queste. Sono in perdita su quale timeout potrebbe colpire (a circa 200 secondi).

Il timeout della connessione SQL viene lasciato sul valore predefinito (la connessione si apre correttamente), il timeout del comando è di 300 secondi (sono necessari solo 12-15 per eseguire il comando).

  • C'è qualche altro timeout che potrei perdere?

Ho eseguito il profiler SQL e mostra che il risultato viene restituito correttamente (tutte le istruzioni e RPC completati - nessun errore). L'esecuzione del codice tramite SSMS fornisce risultati perfetti.

Usando reflector, ho inserito il SNINativeMethodWrapper, ed è un wrapper per il codice non gestito e non riesco a vedere cosa sta realmente cercando di fare. Posso solo supporre (forse erroneamente) che il codice abbia ricevuto il TDS dal server SQL e che il wrapper stia cercando di ottenere la connessione associata al pacchetto e non può.

  • Qualcuno sa cosa dovrebbe fare questo wrapper?
  • Esiste un modo per tracciare / eseguire il debug di questo codice per scoprire cosa sta causando l'errore?

Ho provato a utilizzare metodi diversi (ExecScalar, DataAdapter), ma tutti usano ExecuteReader internamente.

Ho provato a disabilitare il pool di connessioni e a forzare il client a utilizzare la stessa dimensione di pacchetto del server.

  • Qualcuno ha qualche idea su cosa causi questo o cosa posso fare per isolare e provare a correggere il problema?

Questo è il codice chiamante in cui viene generata l'eccezione.

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

Stack

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()...
È stato utile?

Soluzione

Credo di aver risolto il problema. La riga di codice offensiva nell'esempio sopra era l'istruzione ...

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

Questa è una chiamata a un Application Block (MS enterprise library) per la registrazione di eventi in file flat (in questo caso) o registri eventi.

Questo, tra ExecuteXMLReader () e l'uso effettivo del lettore nel documento XML, a volte falliva duramente, causando l'interruzione dell'intero thread. Ho spostato la riga dopo _xmlReader.Close () e ho risolto il problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top