Domanda

Ho un WCF-servizio in esecuzione su un server, e di tanto in tanto (1-2 volte al mese) viene generata COMException con il messaggio informativo “Errore sconosciuto (0x8005008)”. Quando ho googled per questo particolare errore ho ottenuto solo le discussioni sui problemi durante la creazione di directory virtuali in IIS. E il codice sorgente non ha niente con fare una directory virtuale in IIS.

DirectoryServiceLib.LdapProvider.Directory - CreatePost - Could not create employee for 195001010000,000000000000: System.Runtime.InteropServices.COMException (0x80005008): Unknown error (0x80005008) at System.DirectoryServices.PropertyValueCollection.PopulateList

ho preso un memorydump quando ho intercettare l'eccezione per ulteriori analisi in WinDBG. Dopo il passaggio al thread destra ho eseguito il comando clrstack:

000000001b8ab6d8 000000007708671a [NDirectMethodFrameStandalone: 000000001b8ab6d8] Common.MemoryDump.MiniDumpWriteDump(IntPtr, Int32, IntPtr, MINIDUMP_TYPE, IntPtr, IntPtr, IntPtr)
000000001b8ab680 000007ff002808d8 DomainBoundILStubClass.IL_STUB_PInvoke(IntPtr, Int32, IntPtr, MINIDUMP_TYPE, IntPtr, IntPtr, IntPtr)
000000001b8ab780 000007ff00280812 Common.MemoryDump.CreateMiniDump(System.String)
000000001b8ab7e0 000007ff0027b218 DirectoryServiceLib.LdapProvider.Directory.CreatePost(System.String, DirectoryServiceLib.Model.Post, DirectoryServiceLib.Model.Presumptions, Services.Common.SourceEnum, System.String)
000000001b8ad6d8 000007fef8816869 [HelperMethodFrame: 000000001b8ad6d8] 
000000001b8ad820 000007feec2b6c6f System.DirectoryServices.PropertyValueCollection.PopulateList()
000000001b8ad860 000007feec225f0f System.DirectoryServices.PropertyValueCollection..ctor(System.DirectoryServices.DirectoryEntry, System.String)
000000001b8ad8a0 000007feec22d023 System.DirectoryServices.PropertyCollection.get_Item(System.String)
000000001b8ad8f0 000007ff00274d34 Common.DirectoryEntryExtension.GetStringAttribute(System.String)
000000001b8ad940 000007ff0027f507 DirectoryServiceLib.LdapProvider.DirectoryPost.Copy(DirectoryServiceLib.LdapProvider.DirectoryPost)
000000001b8ad980 000007ff0027a7cf DirectoryServiceLib.LdapProvider.Directory.CreatePost(System.String, DirectoryServiceLib.Model.Post, DirectoryServiceLib.Model.Presumptions, Services.Common.SourceEnum, System.String)
000000001b8adbe0 000007ff00279532 DirectoryServiceLib.WCFDirectory.CreatePost(System.String, DirectoryServiceLib.Model.Post, DirectoryServiceLib.Model.Presumptions, Services.Common.SourceEnum, System.String)
000000001b8adc60 000007ff001f47bd DynamicClass.SyncInvokeCreatePost(System.Object, System.Object[], System.Object[])

La mia conclusione è che non riesce quando il codice chiama System.DirectoryServices.PropertyCollection.get_Item (System.String).

Così, dopo l'emissione di un clrstack -a ottengo questo risultato:

000000001b8ad8a0 000007feec22d023 System.DirectoryServices.PropertyCollection.get_Item(System.String)
   PARAMETERS:
      this = <no data>
      propertyName = <no data>
   LOCALS:
      <CLR reg> = 0x0000000001dcef78
      <no data>

La mia prima domanda è: perché lo fa visualizzare alcun dato sul propertyname? Sono un po nuovo sul Windbg. Tuttavia ho eseguito un dumpobject on = 0x0000000001dcef78:

0:013> !do 0x0000000001dcef78
Name:        System.String
MethodTable: 000007fef66d6960
EEClass:     000007fef625eec8
Size:        74(0x4a) bytes
File:        C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
String:      personalprescriptioncode
Fields:
                  MT    Field   Offset                 Type VT     Attr            Value Name
000007fef66dc848  40000ed        8         System.Int32  1 instance               24 m_stringLength
000007fef66db388  40000ee        c          System.Char  1 instance               70 m_firstChar
000007fef66d6960  40000ef       10        System.String  0   shared           static Empty
                                 >> Domain:Value  0000000000174e10:00000000019d1420 000000001a886f50:00000000019d1420 <<

Così, quando il codice sorgente vuole prendere il personalprescriptioncode da Active Directory (quello che viene utilizzato per lo strato di persistenza) fallisce. Guardando indietro al camino è al momento del rilascio il metodo Copy. DirectoryServiceLib.LdapProvider.DirectoryPost.Copy (DirectoryServiceLib.LdapProvider.DirectoryPost)

Quindi, guardando nel codice sorgente:

DirectoryPost postInLimbo = DirectoryPostFactory.Instance().GetDirectoryPost(LdapConfigReader.Instance().GetConfigValue("LimboDN"), idGenPerson.ID.UserId);
if (postInLimbo != null)
   newPost.Copy(postInLimbo);

Questo codice è alla ricerca di un altro posto in OU = limbo con lo stesso ID utente e se ne trova uno lo copia gli attributi al nuovo incarico. In questo caso si fa e non riesce con personalprescriptioncode. Ho guardato lì in Active Directory sotto OU = Limbo e il post esistere con l'attributo personalprescriptioncode = 31243.

Domanda 1: Perché si visualizza non ci sono dati per alcuni dei parametri e gente del posto? È il GC che ha ripulito prima che il memorydump era stato creato.

Domanda 2: C'è più che posso fare per arrivare alla soluzione di questo problema

?
È stato utile?

Soluzione

//
// MessageId: E_ADS_BAD_PARAMETER
//
// MessageText:
//
//  One or more input parameters are invalid
//
#define E_ADS_BAD_PARAMETER              _HRESULT_TYPEDEF_(0x80005008L)

Non è possibile visualizzare i valori delle variabili di argomento / locale perché il codice è ottimizzato. Vengono memorizzati in registri della CPU al momento della chiamata, non lo stack frame. Non è possibile trovare l'ago nel pagliaio più.

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