Pregunta

He escrito una pequeña aplicación que utiliza C # para copiar un documento en la carpeta de un individuo 'Mis documentos' en nuestro servidor DMS.

He beased el código de todo el registro contemplado en el. 'SDK WorkSite 8: Utilizar el IMANEXT2Lib.IManRefileCmd a Archivo Nuevo carpetas de documentos' del blog

El uso de este código en una aplicación WinForm no tengo problemas para copiar el archivo desde la carpeta de origen en la carpeta de los usuarios DMS 'Mis documentos'.

Sin embargo si uso el código en una línea de comandos de la aplicación / .dll o cualquier otro tipo de aplicación (que no sea WinForm) durante el proceso de copia de recibo de los mensajes de error;

1.

  

Se ha producido un error cuando intenta iniciar sesión el evento!

     

IManExt: Se produjo un error cuando intenta iniciar sesión el evento

!      

Acceso denegado.

2.

  

El documento fue importado a la base de datos, pero no pudo ser añadido a   la carpeta.

     

IManExt: El documento fue importado a la base de datos, pero no pudo ser   añadido a la carpeta.

     

IManExt.LogRuleEventsCmd.1: Se produjo un error cuando intenta iniciar sesión el evento

!      

IManExt.LogRuleEventsCmd.1:. Acceso denegado

Se ha producido un error cuando intenta iniciar sesión el evento!

-% -

¿Alguien sabe por qué había que recibe el 'Acceso denegado' mensaje de error cuando se utiliza una aplicación no WinForms para copiar documentos? ¿Qué necesitaría hacer para solucionar este problema?

Cualquier ayuda sería increíble!

Código en su lugar:

    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.");
                }

            }


        }

    }

¿Fue útil?

Solución

Sólo en caso de que esto ayude a alguien más.

Parece que mi problema era el resultado de un problema de enhebrado.

Me di las aplicaciones # winform C que había creado se configura automáticamente para ejecutarse en un solo hilo 'ApartmentState' ([STAThread]).

Mientras que la aplicaciones de consola y biblioteca de clases de estado y manejo de hilos no se habían definido dentro del proyecto y estaba siendo manejado con la configuración por defecto .NET.

Para conseguir esto para el trabajo:. En la aplicación de consola, me acaba de agregar la etiqueta [STAThread] en la línea por encima de mi llamada al método principal

En la biblioteca de clases, he definido un hilo para la función de referencia a la IMANxxx.dll y establecer ApartmentState por ejemplo.

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

En ambos casos, lo que garantiza solo hilo 'ApartmentState' fue implementado conjunto sería resolver el problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top