Ich versuche, den Inhalt des relativ großen Öffentlichen Ordner-Layouts (mehrere 000 Ordner) meines Unternehmens aus Exchange Server 2010 mit RDO 5.14 zu exportieren.Verwenden von RDO/MAPI zum Extrahieren großer Informationsspeicher für Öffentliche Ordner und Abrufen von E_MAPI_TOO_BIG
Ich treffe das Problem, das viele Leute finden, in dem Exchange 2010 irgendwann den Fehler E_MAPI_TOO_BIG gibt, weil der Benutzer, den ich benutze, die Exchange-Speichergrenzen documented here verletzt hat.
Die akzeptierte Lösung in vielen Fällen ist while (Marshal.ReleaseComObject(ref)>0)
auf jedem ref anrufen und GC.Collect()
einmal in einer Weile, die der Verarbeitung von mehr Elementen zu ermöglichen, scheint aber immer noch nicht erlaubt, mich in mehr als 500 Meldungen zu erhalten.
Einige spielen mit dem Code herum. Es zeigt die folgende überraschende Tatsache (zumindest für mich).
Wenn ich über die Elemente in einem Ordner wie dieses iterieren ist es kein Problem:
for (int i = 1; i < items.Count; ++i) {
IRDOMail item = items.Item(i);
string SUCCESS = item.EntryID;
}
ABER, wenn ich irgendwann dieses Codebeispiel verwenden Sie es (an anderer Stelle im Code nicht versuchen, andere Ordner zuzugreifen) mit E_MAPI_TOO_BIG:
for (int i = 1; i < items.Count; ++i) {
IRDOMail item = items.Item(i);
string FAIL = item.Subject;
}
an dieser Stelle habe ich die sehr Grenze meiner COM Fähigkeiten erreicht. Es deutet darauf hin, dass ein Teil des Aufhebens einer COM-Eigenschaft eines MailItem in .NET InterOp einen Verweis aufgreift, den ich nicht freigeben kann. Wenn das der Fall ist, bin ich mir nicht sicher, wie ich es beheben kann, wenn überhaupt?
Ähnliches (aber unterschiedliches) Verhalten kann man sehen, wenn ich MAPI ohne RDO verwende, was darauf hindeutet, dass es eine Eigenart von MAPI (14.0) ist?
Sie müssen nur sehr vorsichtig mit hängenden Referenzen sein, und besonders vermeiden, Mehrfachnotation zu verwenden. –