vb.net - Llamadas SqlClient que provocan que "El hilo se haya cancelado en SNINativeMethodWrapper.SNIPacketGetConnection(paquete IntPtr)"
ado.net iis-6 (1)
Creo que he resuelto el problema. La línea ofensiva de código en el ejemplo anterior fue la declaración ...
Logging.DebugEvent.Raise(Me.GetType.Namespace, Reflection.MethodBase.GetCurrentMethod().Name, _
"Report data recieved from database")
Esta es una llamada a un Bloque de aplicación (biblioteca de empresa MS) para registrar eventos en archivos planos (en este caso) o registros de eventos.
Este, entre ExecuteXMLReader () y el uso real del lector en el documento XML, a veces fallaba duramente, provocando la interrupción de todo el hilo. _xmlReader.Close()
la línea a después de _xmlReader.Close()
y se encargó del problema.
Realmente agradecería cualquier sugerencia, no importa cuán simple o compleja sea, para ayudarme a aislar y resolver este problema.
Tengo un poco de código que genera pequeños archivos de informe. Para cada archivo en la colección, se ejecuta un proceso almacenado para obtener los datos a través del lector XML (es un conjunto de resultados bastante grande). Cuando creé todo esto, y lo crucé, todo está bien. Los archivos se generan, no hay errores.
Esta biblioteca se llama vía remota y se aloja a través de IIS. Cuando despliego la biblioteca compilada y la llamo, es capaz de generar algunos de los informes, pero luego lanza una excepción de aborto de subprocesos. Si adjunto el depurador al proceso de trabajo asp y paso por el código, no tengo problemas.
Viendo que esta falla es bastante consistente, busqué similitudes y descubrí que la falla ocurre en diferentes informes, pero parece ocurrir aproximadamente en el mismo punto cronológico.
Esto me llevó a pensar que fue una configuración de tiempo de espera que el depurador está anulando, hice algunos tiempos ásperos del proceso general (no la única parte del código que falla) y parece fallar justo después de unos 200 segundos. El web.config executionTimeout está configurado para 600 minutos (bastante alto). Esta aplicación de servidor tiene otras partes que requieren transacciones COM + (tiempo de espera de 2 minutos), pero esta no es una de ellas. No sé qué tiempo de espera podría estar pasando (aproximadamente a la marca de los 200 segundos).
El tiempo de espera de la conexión SQL se deja en forma predeterminada (la conexión se abre con éxito), el tiempo de espera del comando es de 300 segundos (solo se requieren 12-15 para ejecutar el comando).
- ¿Hay algún otro tiempo de espera que me pueda estar perdiendo?
Ejecuté el generador de perfiles SQL, y muestra que el resultado se devuelve correctamente (todas las declaraciones y RPC completados - sin errores). Ejecutar el código a través de SSMS proporciona resultados perfectos.
Usando el reflector, perforé el SNINativeMethodWrapper, y es un contenedor para código no administrado y no puedo ver lo que está tratando de hacer realmente. Solo puedo suponer (quizás erróneamente) que el código ha recibido el TDS del servidor SQL y el contenedor trata de obtener la conexión asociada con el paquete y no puede.
- ¿Alguien sabe lo que se supone que debe hacer este envoltorio?
- ¿Hay alguna forma de rastrear / depurar este código para descubrir qué está causando la falla?
Intenté usar diferentes métodos (ExecScalar, DataAdapter), pero todos usan ExecuteReader internamente.
Intenté deshabilitar la agrupación de conexiones y forzar al cliente a usar el mismo tamaño de paquete que el servidor.
- ¿Alguien tiene alguna idea sobre qué causa esto o qué puedo hacer para aislar y tratar de corregir el problema?
Este es el código de llamada donde se genera la excepción.
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
Apilar
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()...