2017-09-28 5 views
0

Tout d'abord, ce problème ne se produit que sur quelques machines clientes et je ne peux pas le répliquer sur mon test Machines.Le code d'interopérabilité Outlook lève l'erreur "message a été modifié" la seconde fois que le code essaie d'enregistrer un article

J'ai donc le code de test suivant LINQPad:

var application = new Application(); 
var session = application.Session; 
const string entryId = "arbitrary entry ID"; 
const string propertyName = "http://schemas.microsoft.com/mapi/string/{31A9B8DA-D4A0-4B96-87AE-01D6E9BCFCCE}/Test/0x0000001F"; 

// Save test property for the first time. 
var mail = (MailItem)session.GetItemFromID(entryId); 
var propertyAccessor = mail.PropertyAccessor; 
propertyAccessor.SetProperty(propertyName, 1); 
mail.Save(); 

Marshal.ReleaseComObject(propertyAccessor); 
Marshal.ReleaseComObject(mail); 

// Save test property for the second time. 
mail = (MailItem)session.GetItemFromID(entryId); 
var propertyAccessor = mail.PropertyAccessor; 
propertyAccessor.SetProperty(propertyName, 2); 
mail.Save(); 

Marshal.ReleaseComObject(propertyAccessor); 
Marshal.ReleaseComObject(mail); 
Marshal.ReleaseComObject(session); 
Marshal.ReleaseComObject(application); 

Le second mail.Save() appel a un taux de 100% sur ces quelques machines clientes à jeter l'exception: System.Runtime.InteropServices.COMException (0x80040109): The operation cannot be performed because the message has been changed.

Étant donné que le code ci-dessus correctement libère le premier objet mail et récupère le deuxième objet mail à l'aide de l'ID d'entrée à nouveau. La chance d'avoir quelque chose qui change l'objet mail entre la seconde récupération de l'objet et l'appel de sa méthode Save() est très faible, sans parler du taux reproductible à 100%.

Je ne peux que penser que cela ressemble à un bogue dans Outlook qu'il peut marquer de manière permanente un objet mail modifié dès que quelque chose appelle la méthode Save() une fois.

Est-ce que quelqu'un sait s'il y a du travail?

Ces machines utilisent la dernière version d'Office 2016.

+0

Est-ce une boîte aux lettres Exchange? Parfois, la modification est synchronisée avec le serveur de boîtes aux lettres distant, le serveur effectue sa propre modification et la modification est téléchargée dans le fichier OST local. Cela peut provoquer le conflit. Le message est-il sélectionné au moment où le code s'exécute? –

+0

C'est un compte IMAP. Le message a été sélectionné ou ouvert dans une fenêtre d'inspecteur. –

Répondre

1

est l'un des IMAP4 le pire - à chaque fois que vous essayez de toucher l'un des objets du magasin, il essaie de synchroniser. Vous pouvez essayer de contourner la couche IMAP4 et aller directement au fournisseur PST utilisé comme stockage local sous-jacent. En MAPI étendu (C++ ou Delphi), vous pouvez le faire en utilisant l'interface IProxyStoreObject. Dans le cas de langues autres que C++ ou Delphi, vous pouvez utiliser Redemption et RDOSession. Stores. UnwrapStore méthode - le message peut être ensuite ouvert à partir du magasin non emballé en utilisant RDOStore. GetMessageFromID.