2009-12-17 20 views
3

J'ai écrit une petite application en utilisant C# pour copier un document dans un dossier «Mes documents» sur notre serveur DMS.IManExt ImportCmd problème

J'ai ajouté le code autour de la liste fournie dans le 'WorkSite SDK 8: Utiliser le blog IMANEXT2Lib.IManRefileCmd pour créer un dossier de nouveaux documents'. En utilisant ce code dans une application WinForm, je n'ai aucun problème pour copier le fichier du dossier source dans le dossier Mes Documents de DMS des utilisateurs.

Cependant, si j'utilise le code dans une application de ligne de commande/.dll ou tout autre type d'application (autre que WinForm) pendant le processus de copie, je reçois les messages d'erreur;

1.

Une erreur est survenue lorsque vous essayez d'enregistrer l'événement! IManExt: Une erreur est survenue lors de la tentative d'enregistrement de l'événement!

L'accès est refusé.

2.

Le document a été importé à la base de données, mais ne pouvait pas être ajouté à le dossier. IManExt: Le document a été importé dans la base de données, mais il n'a pas pu être ajouté au dossier dans .

IManExt.LogRuleEventsCmd.1: Une erreur s'est produite lors de la tentative d'enregistrement de l'événement!

IManExt.LogRuleEventsCmd.1: L'accès est refusé.

Une erreur s'est produite lors de la tentative d'enregistrement de l'événement!

-% -

Est-ce que quelqu'un sait pourquoi je recevoir le 'Accès refusé' des messages d'erreur lors de l'utilisation d'une application non-WinForms pour copier des documents? Que devrais-je faire pour contourner ce problème?

Toute aide serait incroyable!

code en place:

public void moveToDMS(String servName, String dBName, String foldName) 
    { 
     const string SERVERNAME = servName; //Server name 
     const string DATABASENAME = dBName; //Database name 
     const string FOLDERNAME = foldName; //Matter alias of workspace 

     IManDMS dms = new ManDMSClass(); 
     IManSession sess = dms.Sessions.Add(SERVERNAME); 
     sess.TrustedLogin(); 

     //Get destination database. 
     IManDatabase db = sess.Databases.ItemByName(DATABASENAME); 

     //Get destination folder by folder and owner name. 
     IManFolderSearchParameters fparms = dms.CreateFolderSearchParameters(); 
     fparms.Add(imFolderAttributeID.imFolderOwner, sess.UserID); 
     fparms.Add(imFolderAttributeID.imFolderName, FOLDERNAME);   

     //Build a database list in which to search. 
     ManStrings dblist = new ManStringsClass(); 
     dblist.Add(db.Name); 

     IManFolders results = sess.WorkArea.SearchFolders(dblist, fparms); 

     if (results.Empty == true) 
     { 
      //No results returned based on the search criteria. 
      Console.WriteLine("NO RESULTS FOUND!"); 
     } 

     IManDocumentFolder fldr = null; 

     if (results.Empty == false) 
     { 
      //Assuming there is only one workspace returned from the results. 
      fldr = (IManDocumentFolder)results.ItemByIndex(1); 
     } 

     if (fldr != null) 
     { 
      // Import file path 
      string docPath = @"C:\Temp\"; 
      string docName = "MyWord.doc"; 

      // Create an instance of the ContextItems Collection Object. 
      ContextItems context = new ContextItemsClass(); 

      // Invoke ImportCmd to import a new document to WorkSite database. 
      ImportCmd impCmd = new ImportCmdClass(); 

      // The WorkSite object you pass in can be a database, session, or folder. 
      // Depends on in where you want the imported doc to be stored. 
      context.Add("IManDestinationObject", fldr); //The destination folder. 

      // Filename set here is used for easy example, a string variable is normally used here 
      context.Add("IManExt.Import.FileName", docPath + docName); 

      // Document Author 
      context.Add("IManExt.Import.DocAuthor", sess.UserID); //Example of a application type. 

      // Document Class 
      context.Add("IManExt.Import.DocClass", "BLANK"); //Example of a document class. 
      //context.Add("IManExt.Import.DocClass", "DOC"); //Example of a document class. 

      // Document Description (optional) 
      context.Add("IManExt.Import.DocDescription", docName); //Using file path as example of a description. 

      // Skip UI 
      context.Add("IManExt.NewProfile.ProfileNoUI", true); 

      impCmd.Initialize(context); 
      impCmd.Update(); 

      if (impCmd.Status == (int)CommandStatus.nrActiveCommand) 
      { 
       impCmd.Execute(); 

       bool brefresh = (bool)context.Item("IManExt.Refresh"); 
       if (brefresh == true) 
       { 
        //Succeeded in importing a document to WorkSite 
        IManDocument doc = (IManDocument)context.Item("ImportedDocument"); 

        //Succeeded in filing the new folder under the folder. 
        Console.WriteLine("New document number, " + doc.Number + ", is successfully filed to " + fldr.Name + " folder."); 
       } 

      } 


     } 

    } 

+0

Je ne suis pas sûr si vous surveillez ce plus, mais j'espérais peut-être que vous pourriez me diriger vers où vous avez obtenu ce code? J'essaie d'interagir avec iManage/Worksite, mais je n'ai accès à aucune documentation à l'origine de certaines politiques d'entreprise agaçantes. – JamesMLV

Répondre

2

Juste au cas où cela aide quelqu'un d'autre.

Il semble que mon problème était le résultat d'un problème de threading. J'ai remarqué que les applications winform C# que j'avais créées étaient automatiquement configurées pour s'exécuter sur un seul thread 'ApartmentState' ([STAThread]). Alors que l'état des threads et la gestion des bibliothèques de classes & n'ont pas été définis dans le projet et sont gérés avec la configuration par défaut .NET.Pour que cela fonctionne: Dans l'application console, j'ai simplement ajouté la balise [STAThread] sur la ligne au-dessus de mon appel de méthode principale.

Dans la bibliothèque de classes, j'ai défini un thread pour la fonction référençant le IMANxxx.dll et défini ApartmentState par ex.

Thread t = new Thread(new ThreadStart(PerformSearchAndMove)); 
t.SetApartmentState(ApartmentState.STA); 
t.Start(); 

Dans les deux cas assurant seul thread « ApartmentState » a été mis en œuvre ensemble résoudrait le problème.