¿Cuál es la mejor forma y las prácticas recomendadas para interactuar con Lotus Notes desde C#
interop lotus-notes (10)
Eche un vistazo a NotesSQL:
http://www.ibm.com/developerworks/lotus/products/notesdomino/notessql/
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.
Editar
Gracias por las respuestas, las cuales son buenas. 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.
Si tiene un cliente de Domino / Lotus Notes instalado en la misma máquina, puede usar 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 el cliente Domino / Lotus Notes instalado 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.
Trabajé en un complemento de Notes durante varios meses hace un tiempo, 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 tienes que hacer un poco de gimnasia de código ...
Puede crear un servicio web de Domino usando Java o LotusScript. Luego use C # para acceder al servicio web.
Solo lo he hecho una vez, para leer datos de un db de Lotus Notes en una aplicación .NET que se ejecuta en otra máquina.
Escritura y prueba de servicios web simples http://www.ibm.com/developerworks/lotus/library/web-services2/
cuando encuentre algo de tiempo, escribiré un ejemplo completo :-)
Aquí puede encontrar una referencia API Api de Lotus Notes
Para obtener una sesión de Notes (El punto de partida) en VB.Net puede usar:
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.
Ya 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 el blog de Bob Balaban .
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 #.
Realmente odio ese 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 sugiero usarlo de esta manera, en un bloque de uso :
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
Observe el Thread.BeginThreadAffinity () y el Thread.EndThreadAffinity ()
Esos son tus amigos.
¡Salud!
Personalmente, me gusta mucho el ensamblado .NET empaquetado de 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 contenedor 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.
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 la API de Domino 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 hará que la API completa y el cliente Notes se bloqueen (incluso si no tiene el cliente abierto, no podrá iniciarlo después de que la API falle sin reiniciar su computadora o llamando a "nsd -kill"). Divertido.
Descubrí que al usar la API de Notes C dentro de C # a través de P / Invoke, puede administrar mejor los recursos de la memoria para que la API no cause fallas y fallas 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 solo he necesitado) de la API de Notes C son:
NotesSession (como NotesRuntime) NotesDatabase NotesNote NotesItem NotesDXLExporter NotesNoteCollection
Además de 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 algunos ejemplos más adelante (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 la referencia "Lotus C API 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 #. :)