Исключение пустой ссылки .Net в DocumentXPathNavigator - PullRequest
0 голосов
/ 30 декабря 2011

Я столкнулся с интересным исключением.На одном из моих производственных серверов иногда я получаю следующее исключение.

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)

Открытие IL и просмотр каждого метода предполагает, что DocumentXPathNavigator => this.document имеет значение null.Что странно, так это то, что я никоим образом не могу продублировать эту проблему локально или на наших тестовых серверах.

Небольшая предыстория, и это может быть ключевым моментом ... Это веб-приложение (работает .Net 3.5), котороекэширует XmlDocument, который передается в XslCompiledTransform.Transform ().Наше кэширование обслуживается через сервер распределенного кэша.XmlDocument сериализуется и кэшируется, поэтому ссылка на конкретный объект не должна продолжать существовать.Это заставляет меня поверить, что либо что-то явно препятствует установке this.document, когда происходит неявное XmlDocument -> DocumentXPathNavigator, либо когда какая-то ссылка где-то удаляется во время работы Transform ().В любом случае я в замешательстве.

Итак, я думаю, мои вопросы:

  1. Кто-нибудь еще видел это раньше?
  2. Кто-нибудь знает, что может быть причиной этого?или как с этим бороться?

Спасибо

РЕДАКТИРОВАТЬ: После дальнейших размышлений об этом, единственное, что имело бы смысл - это состояние гонки.Устройство кэширования каким-то образом истекает, пока приложение использует объект.

РЕДАКТИРОВАТЬ / РЕДАКТИРОВАТЬ: .Net 3.5, упомянутые выше сборки имеют размер 2.0

Ответы [ 2 ]

0 голосов
/ 04 января 2014

Я обнаружил очень похожее исключение внутри XslCompiledTransform:

   System.Web.HttpUnhandledException (0x80004005): Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> System.NullReferenceException: Object reference not set to an instance of an object.
      at MS.Internal.Xml.Cache.XPathDocumentNavigator.get_NodeType()
      at System.Xml.XPath.XPathNavigator.MoveToNonDescendant()
      at System.Xml.Xsl.Runtime.DescendantMergeIterator.MoveNext(XPathNavigator input)
      at <xsl:template name="SystemPartIncluded">(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime, IList`1 PartNumber, XPathNavigator Description, IList`1 DescriptionOverride, IList`1 Quantity, IList`1 ExtendedPrice, String LabelWhiteSpace)
      at <xsl:template name="compiler:generated"> (30)(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime, XPathNavigator {urn:schemas-microsoft-com:xslt-debug}current, XPathNavigator isBundledWithCanvas, XPathNavigator SoftwareExtendedPrice, XPathNavigator SoftwareUnitPrice, IList`1 PixelNet, IList`1 Revision_Date, IList`1 Catalyst)
      at <xsl:template name="compiler:generated"> (45)(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime, XPathNavigator {urn:schemas-microsoft-com:xslt-debug}current, XPathNavigator SoftwareUnitPrice, XPathNavigator HardwareExtendedPrice, XPathNavigator HardwareUnitPrice, XPathNavigator PixelNetUnitPrice, XPathNavigator FusionUnitPrice)
      at <xsl:template match="Quote">(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime, XPathNavigator {urn:schemas-microsoft-com:xslt-debug}current, Double {urn:schemas-microsoft-com:xslt-debug}position, Double {urn:schemas-microsoft-com:xslt-debug}last)
      at <xsl:template match="/">(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime, XPathNavigator {urn:schemas-microsoft-com:xslt-debug}current)
      at Root(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime)
      at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlWriter writer)
      at MyApp.clsXML.XslTransformationToHtml(IQEntities DC, Int32 loggedOnUserID, IXPathNavigable input, String xslStylesheetFilePath, XsltArgumentList xslArgs, String XmlRepositoryVersion) in MyApp\App_Data\Static Classes\xml_routines.cs:line 510
      at MyApp.clsQuote.RenderOneQuote(IQEntities DC, Int32 loggedOnUserID, Int32 quoteID, Boolean booPrintFormat, Boolean booDiscount_Prices, Boolean booIs_Super_Administrator, Boolean isHostRep, String strOrganization_Table_Caption, Boolean showBottomLineOnly) in MyApp\App_Data\Static Classes\quote_routines.cs:line 476
      at MyApp.Pages.AJAX.BrowseQuotes.RenderSelectedQuote(Int32 quoteID) in MyApp\Pages\AJAX\BrowseQuotes.aspx.cs:line 66
      at MyApp.Pages.AJAX.BrowseQuotes.ucQuotePicker1_OnQuoteSelectedEvent(Object sender, Int32 quoteID) in b:\DotNet\IQ\WinMetrics.IQ\Pages\AJAX\BrowseQuotes.aspx.cs:line 56
      at System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup)
      at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
      at System.Web.UI.Page.HandleError(Exception e)
      at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
      at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
      at System.Web.UI.Page.ProcessRequest()
      at System.Web.UI.Page.ProcessRequest(HttpContext context)
      at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

Как и вы, мы передавали XPathDocument в преобразование Xsl, а XPathDocument извлекался из распределенного кэша.К сожалению, XPathDocument не сериализуем и поэтому непригоден для использования после извлечения из распределенного кэша.Мы устранили проблему, используя XmlDocument вместо XPathDocument и используя SerializedXmlDocument для его сериализации и десериализации следующим образом:

        public static XmlDocument CachedXmlDoc
        {
            get
            {
                lock (_locker)
                {
                    // maintain the Part XmlDocument in the distributed cache so that it can be reset from any production instance
                    SerializedXmlDocument serializedXmlDoc = Reliable.Application[Global.CACHED_XML_DOC] as SerializedXmlDocument;
                    XmlDocument cachedDoc = (serializedXmlDoc == null) ? null : serializedXmlDoc.XmlDocument;
                    if (cachedDoc == null)
                    {
                        cachedDoc = myController.CreateXmlDoc();
                        Reliable.Application[Global.CACHED_XML_DOC] = new SerializedXmlDocument(cachedDoc);
                    }
                    return cachedDoc;
                }
            }
            set
            {
                lock (_locker)
                {
                    if (value == null)
                    {
                        Reliable.Application[Global.CACHED_XML_DOC] = null;
                    }
                    else
                    {
                        throw new Exception("Tried to set the cached XmlDocument to something other than null.");
                    }
                }
            }
        }
0 голосов
/ 24 апреля 2013

В случае, если у кого-то есть такое же исключение.

Мы обнаружили, что это исключение возникает, когда xmldocument.HasChildNodes имеет значение false или DocumentElement имеет значение null.Проверка наличия в документе элементов, ДО запрашивающих его, разрешает это.

...