2011-12-30 4 views
0

Я столкнулся с интересным исключением. На одном из моих производственных серверов время от времени я получаю следующее исключение.. Исключение Null Reference в 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) 

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

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

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

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

Благодаря

EDIT:
После дальнейшего думать об этом, единственное, что будет иметь смысл в том, что это состояние гонки. Устройство кэширования каким-то образом завершает работу объекта, пока приложение использует этот объект.

EDIT/EDIT:
.Net 3.5, на которые ссылаются assembilies выше 2,0

+0

Какой версии .NET? –

+0

Похоже, что вход неверный. Вы подтвердили это? –

+0

Если вы следуете трассировке стека, вход фактически проверяется, прежде чем он когда-либо достигнет этой точки. Возможно, он изменится между тем, когда он будет проверен, и когда он доберется до этого момента. – John

ответ

0

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

Мы обнаружили, что это исключение возникает, когда xmldocument.HasChildNodes является false или DocumentElement имеет значение NULL. Проверка того, что документ содержит элементы, ПЕРЕД НАЧАЛОМ, запрашивая его, решает это.

0

я испытал очень похожее исключение внутри 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."); 
        } 
       } 
      } 
     } 
Смежные вопросы