2008-09-05 22 views
16

En particular, tengo que extraer todos los mensajes y archivos adjuntos de los archivos de Lotus Notes de la manera más rápida y confiable. Otro punto que puede ser relevante es que necesito hacer esto a partir de un hilo secundario.¿Cuál es la mejor forma y prácticas recomendadas para interactuar con Lotus Notes desde C#

Editar

Gracias por las respuestas - ambos de los cuales son buenos. Debo proporcionar más información de fondo.

Actualmente tenemos una aplicación WinForms con un hilo de fondo utilizando la API COM de Notes.

Sin embargo, parece ser inestable. (Por supuesto, puede ser que estemos haciendo algo mal.) Por ejemplo, hemos encontrado que tenemos que preinicializar la sesión de Notes en el hilo principal o la llamada a la sesión. Crear DXLExporter() en el hilo de fondo arroja una excepción.

Respuesta

2

Si usted tiene un cliente de Domino/Lotus Notes instalado en la misma máquina, puede utilizar COM. Simplemente realice una búsqueda en Google sobre 'Acceso a los Objetos de Domino a través de COM' y encontrará la entrada de ayuda de Domino Designer para casi cualquier versión de Domino.

También puede acceder a Domino a través de la API C, pero no lo recomendaría. Muy desordenado. También necesita instalar el cliente de Domino/Lotus Notes.

Si no tiene tiene tiene instalado el cliente Domino/Lotus Notes en la misma máquina y el servidor Domino está ejecutando http, también puede hacerlo a través de http. Esto no será tan rápido. También es probable que desee una configuración personalizada de vistas http en el servidor Domino para facilitarle la vida.

2

Puede crear un servicio web de Domino utilizando Java o LotusScript. Luego use C# para acceder al servicio web.

Solo he hecho esto una vez, para leer datos de un db de Lotus Notes en una aplicación .NET que se ejecuta en otra máquina.

escribir y probar los servicios web simples http://www.ibm.com/developerworks/lotus/library/web-services2/

cuando encuentro algún tiempo voy a escribir un ejemplo completo :-)

+0

Hola Eric ... En este momento estoy usando la interoperabilidad pero estoy pensando en cambiar al servicio web. Para usar Interop uno necesita instalar Lotus Notes en esa máquina. ¿Es el mismo caso con el servicio web? Gracias – om471987

+0

No, usted llama a un servicio web en el servidor de Domino, y esa funcionalidad está incorporada a partir de Notes 7.0, creo. Para que no necesite el cliente de Notes instalado localmente, desde donde llama al servicio web. –

1

trabajé en un plugin Notas durante varios meses un poco de tiempo atrás, y sí , la API puede ser enloquecedor. Sin embargo, pude hacerlo funcionar para poder acceder a toda la información de Notes usando una aplicación C# (de hecho, ya que estaba escribiendo un complemento, hice que Notes llamara a la aplicación C# a través de un puente C++ que registró en una archivo .ini de inicio). Ciertos métodos que documentan en su API en realidad no funcionan, por lo que se requieren muchas pruebas. A veces hay que hacer un poco de gimnasia de código ...

3

An Lotus Notes COM Referencia API se puede encontrar here

para obtener una sesión Notas (El punto de partida) en VB.Net que puede utilizar:

Dim oSess As Object = Nothing 
oSess = CreateObject("Notes.NotesSession") 

Normalmente programo en C#, para operar con COM prefiero VB.Net

Es mejor acceder a todos los servidores COM desde el mismo hilo, a menos que esté seguro de que no causará ningún problema.

1

De regreso en el día, habría recomendado N2N de Proposion, pero ese producto se ha ido desde que Quest adquirió Proposion.

Dicho esto, Proposion fue una prueba de que puede ajustar la API de Notes en un conjunto de clases .Net de forma segura. Puede encontrar información sobre eso en Bob Balaban's blog.

0

Yo personalmente haría esto nativo en Notes en LotusScript o Java. Puede hacer un agente programado en Notes mucho más fácil que un servicio en C#.

6

Realmente odio el objeto COM de NotesSession.

No puede usarlo en otro subproceso que el subproceso que se inicializó. Los hilos en .NET son fibras, el hilo subyacente real puede cambiar en cualquier momento.

Así que sugieren el uso de esta forma, en un bloque de usando:

Imports Domino 
Imports System.Threading 

Public Class AffinitedSession 
    Implements IDisposable 

    Private _session As NotesSession 
    Public Sub New(ByVal pass As String) 
     Thread.BeginThreadAffinity() 
     _session = New NotesSession() 
     _session.Initialize(pass) 
    End Sub 

    Public ReadOnly Property NotesSession() As NotesSession 
     Get 
      Return _session 
     End Get 
    End Property 

    Private disposedValue As Boolean = False  ' To detect redundant calls 

    ' IDisposable 
    Protected Overridable Sub Dispose(ByVal disposing As Boolean) 
     If Not Me.disposedValue Then 
      If disposing Then 
       ' TODO: free other state (managed objects). 
      End If 

      ' TODO: free your own state (unmanaged objects). 
      ' TODO: set large fields to null. 
      _session = Nothing 
      Thread.EndThreadAffinity() 
     End If 
     Me.disposedValue = True 
    End Sub 

#Region " IDisposable Support " 
    ' This code added by Visual Basic to correctly implement the disposable pattern. 
    Public Sub Dispose() Implements IDisposable.Dispose 
     ' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above. 
     Dispose(True) 
     GC.SuppressFinalize(Me) 
    End Sub 
#End Region 

End Class 

Aviso del Thread.BeginThreadAffinity() y el Thread.EndThreadAffinity()

Esos son tus amigos.

¡Salud!

+0

Muy interesante respuesta Alex. Lo investigaré más a fondo. Gracias. Por cierto, no he encontrado nada que indique que los hilos .Net son fibras, aunque he visto que algunos doco dicen que no debemos suponer que los hilos .Net tengan una correspondencia de 1 a 1 a los hilos del sistema operativo no gestionados. –

+0

No son fibras * reales * como Python o Ruby, son hilos gestionados. Es por eso que el hilo del sistema operativo subyacente puede cambiar en cualquier momento. –

0

Personalmente, me gusta mucho el ensamblado .NET envuelto por Domino para COM API. Cuando desarrollas tu código C# casi puedes imaginar tus sueños sobre un IDE apropiado. Pero tiene algunos inconvenientes, como para la versión 6.5 (no he intentado más nuevo), se produce un bloqueo de la aplicación en muchos casos cuando el código de LotusScript devuelve una discrepancia de tipo para el parámetro. Pero esto se debe a las limitaciones de COM, por supuesto.

Al mismo tiempo, el envoltorio no permite trabajar con clases NotesUI. Sin embargo, utilicé los reflejos de los ejemplos muy antiguos de Notes COM API para llamar a las clases de NotesUI y funcionó. Fue útil cuando desarrollé un complemento de Outlook que requería interacción con la interfaz de usuario del cliente de Notes. Me las arreglé para crear un contenedor simple para las clases de interfaz de usuario también.

1

Sé que este hilo es antiguo, pero he trabajado mucho con la API de Domino y los objetos Lotus Notes típicos a través de la API COM de Domino.

El problema con Domino API es que su administración de memoria a través de COM es horrible (si usa la API en C#, VB, etc.) y causará fugas de memoria y eventualmente causará toda la API y el cliente de Notes bloquearse (incluso si no tiene el cliente abierto, no podrá iniciarlo después de que la API falle sin reiniciar su computadora o llamar a "nsd -kill"). Divertido.

He encontrado que al usar la API de Notes C dentro de C# a través de P/Invoke, puede administrar mejor los recursos de memoria para que la API no provoque pérdidas y fallos de memoria horribles. Escribí un contenedor parcial en C#, usando P/Invoke, que accede a Notes C API desde notes.dll. El uso que hago no tiene nada que ver con intentar trabajar en un entorno de Domino, sino con el uso del ensamblado de Notas para tener acceso a archivos NSF y extraer información DXL dentro de un entorno C#. Obviamente, necesitaría tener el cliente de Notes instalado para tener acceso a notes.dll y la API de C. Pero mi envoltorio de C# de la API de Notes C funciona muy bien y es más estable que la API COM de Domino que se proporciona al instalar el cliente de Notes.

Las clases que he implementado en C# (que sólo he necesitado) de la API de Notes C son:

NotesSession (como NotesRuntime) NotesDatabase NotesNote NotesItem NotesDXLExporter NotesNoteCollection

así como algunas otras clases provisionales, enumeraciones y estructuras para manejar la traducción de la API C a C#.

Las clases que he implementado hasta ahora han cumplido los propósitos que necesitaba de la API de Notes C. Definitivamente se pueden ampliar, pero no intenté encapsular toda la API dentro del contenedor C# P/Invoke. También tuve que crear controladores para tratar con objetos incrustados OLE que pueden almacenarse en documentos Notes, y obtener los datos almacenados de esos objetos OLE, utilizando objetos Windows IStorage.

Nota: puedo proporcionar algunas muestras más tarde (tengo que cambiar el nombre de los espacios de nombres y generalizar el código, por razones de propiedad), pero creé las clases contenedoras C# utilizando Lotus Lotus Notes/Domino 8.5.2 Reference "NSF proporcionado por IBM/Lotus (como NSF descargable). Usando las definiciones C y las referencias de clase, pude traducirlas a C# P/invocar llamadas y envolverlas en clases C# más amigables, que luego se comportaban más como llamadas de clases de LotusScript, pero dentro de C# y las clases implementadas administran y eliminan su memoria que todo no se cuelga después de haber accedido a cientos de miles de documentos de un programa C#. :)

+0

Avíseme si quiere fuentes de lo que se ha descrito anteriormente. No puedo adjuntarlos aquí, ni quiero proporcionar una dirección FTP pública. –

+0

Gracias @ Brien-Halstead. No tengo una necesidad actual del código, pero sería bueno tenerlo para referencia futura. Siéntase libre de enviarme un mensaje en Twitter (ver mi perfil). –

Cuestiones relacionadas