J'ai rencontré une exception intéressante. Sur l'un de mes serveurs de production, j'obtiens occasionnellement l'exception suivante.. Exception de référence nulle dans DocumentXPathNavigator
System.NullReferenceException: Object reference not set to an instance of an object.
at System.Xml.DocumentXPathNavigator.get_NameTable()
at System.Xml.Xsl.Runtime.XmlQueryContext.get_DefaultNameTable()
at System.Xml.Xsl.Runtime.XmlQueryRuntime..ctor(XmlQueryStaticData data, Object defaultDataSource, XmlResolver dataSources, XsltArgumentList argList, XmlSequenceWriter seqWrt)
at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlSequenceWriter results)
at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlWriter writer, Boolean closeWriter)
at System.Xml.Xsl.XmlILCommand.Execute(IXPathNavigable contextDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlWriter results)
at System.Xml.Xsl.XslCompiledTransform.Transform(IXPathNavigable input, XsltArgumentList arguments, TextWriter results)
at sftControls.SearchListLandingPage.getHtml(IXPathNavigable document, String Xsl, String headerLinks)
ouverture du IL et en regardant à travers chaque méthode suggère que la DocumentXPathNavigator => this.document est nulle. Ce qui est étrange, c'est que je ne peux en aucun cas dupliquer ce problème localement ou sur nos serveurs de test.
Un peu d'arrière-plan, et cela pourrait être la clé ... Il s'agit d'une application Web (exécutant .Net 3.5) qui met en cache le XmlDocument transmis à XslCompiledTransform.Transform(). Notre mise en cache est assurée par un serveur de cache distribué. Le XmlDocument est sérialisé et mis en cache afin qu'une référence à l'objet spécifique ne puisse pas continuer à exister. Cela me porte à croire que quelque chose empêche explicitement ce.document d'être jamais défini lorsque le XmlDocument -> DocumentXPathNavigator implicite se produit ou qu'une référence quelque part est supprimée pendant que Transform() est en cours d'exécution. De toute façon, je suis perplexe.
Donc, je suppose que mes questions sont les suivantes:
- Quelqu'un at-il vu d'autre avant?
- Est-ce que quelqu'un sait ce qui pourrait le causer ou comment y faire face?
Merci
EDIT:
Après une réflexion plus poussée à ce sujet, la seule chose qui aurait du sens est que c'est une condition de course. L'appliance de mise en cache expire d'une manière ou d'une autre lorsque l'application utilise l'objet.
EDIT/EDIT:
.Net 3.5, les assembilies référencé ci-dessus sont 2,0
Quelle est la version .NET? –
Il semble que l'entrée est incorrecte. L'avez-vous validé? –
Si vous suivez la trace de la pile, l'entrée est validée avant même qu'elle ne parvienne à ce point. Il est possible que cela change entre quand il est validé et quand il arrive à ce point. – John