Каков наилучший способ и рекомендуемые практики для взаимодействия с Lotus Notes из C # - PullRequest
16 голосов
/ 05 сентября 2008

В частности, я должен извлечь все сообщения и вложения из файлов Lotus Notes самым быстрым и надежным способом. Другим важным моментом является то, что мне нужно сделать это из вторичного потока.

Редактировать

Спасибо за ответы - оба хороши. Я должен предоставить больше справочной информации.

В настоящее время у нас есть приложение WinForms с фоновым потоком, использующее Notes COM API.

Однако это кажется нестабильным. (Конечно, может быть, мы делаем что-то не так.) Например, мы обнаружили, что нам нужно предварительно инициализировать сеанс Notes в главном потоке или же вызов метода session.CreateDXLExporter () в фоновом потоке вызывает исключение.

Ответы [ 10 ]

6 голосов
/ 16 июля 2010

Я действительно ненавижу этот COM-объект NotesSession.

Вы не можете использовать его в другом потоке, отличном от потока, в котором он был инициализирован. Потоки в .NET - это волокна, реальный базовый поток может измениться в любое время.

Поэтому я предлагаю использовать его таким образом, в используя блок :

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

Обратите внимание на Thread.BeginThreadAffinity () и Thread.EndThreadAffinity ()

Это ваши друзья.

Ура!

3 голосов
/ 22 октября 2008

Ссылку на Lotus Notes COM Api можно найти здесь

Чтобы получить сеанс Notes (начальную точку) в VB.Net, вы можете использовать:

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

Я обычно программирую на C #, для работы с COM я предпочитаю VB.Net

Лучше получить доступ ко всем COM-серверам из одного потока, если вы не уверены, что это не вызовет никаких проблем.

2 голосов
/ 16 сентября 2008

Вы можете создать веб-сервис Domino, используя Java или LotusScript. Затем используйте C # для доступа к веб-сервису.

Я сделал это только один раз, чтобы прочитать данные из базы данных Lotus Notes в приложение .NET, работающее на другом компьютере.

Написание и тестирование простых веб-сервисов http://www.ibm.com/developerworks/lotus/library/web-services2/

когда найду время, напишу полный пример: -)

2 голосов
/ 09 сентября 2008

Если на той же машине установлен клиент Domino / Lotus Notes, вы можете использовать COM. Просто выполните поиск Google в разделе «Доступ к объектам Domino через COM», и вы найдете запись справки Domino Designer практически для любой версии Domino.

Вы также можете получить доступ к Domino через C API, но не рекомендую его. Ужасный беспорядок. Вам также все еще нужно установить клиент Domino / Lotus Notes.

Если у вас не установлен клиент Domino / Lotus Notes на том же компьютере, а сервер Domino работает по протоколу http, вы также можете сделать это через http. Это будет не так быстро. Вы также, вероятно, захотите, чтобы некоторые пользовательские настройки http-представлений на сервере Domino облегчили вашу жизнь.

2 голосов
/ 05 сентября 2008
1 голос
/ 09 апреля 2016

Я знаю, что этот поток старый, но я много работал с Domino API и типичными объектами Notes LotusScript через Domino COM API.

Проблема с Domino API заключается в том, что его управление памятью через COM ужасно (при использовании API в C # или VB и т. Д.), И это приведет к утечкам памяти и в конечном итоге приведет к тому, что весь API и клиент Notes будут сбой (даже если у вас не открыт клиент, вы не сможете запустить его после сбоя API, не перезагружая компьютер или не вызывая «nsd -kill»). Fun.

Я обнаружил, что используя Notes C API в C # через P / Invoke, вы можете лучше управлять ресурсами памяти, чтобы API не вызывало ужасных утечек памяти и сбоев. Я написал частичную оболочку на C #, используя P / Invoke, которая обращается к API Notes C из файла notes.dll. Мое использование этого не имеет ничего общего с попыткой работы в среде Domino, но использует сборку Notes для доступа к файлам NSF для извлечения информации DXL в среде C #. Очевидно, вам потребуется установить клиент Notes, чтобы иметь доступ к notes.dll и C API. Но моя оболочка C # для Notes C API прекрасно работает и более стабильна, чем Domino COM API, которая предоставляется при установке клиента Notes.

Классы, которые я реализовал в C # (которые мне только нужны) из Notes C API:

NotesSession (как NotesRuntime) NotesDatabase NotesNote NotesItem NotesDXLExporter NotesNoteCollection

А также некоторые другие промежуточные классы, перечисления и структуры для обработки перевода из C API в C #.

Классы, которые я реализовал до настоящего времени, служили целям, которые мне были нужны из Notes C API. Их определенно можно расширить, но я не пытался инкапсулировать весь API в оболочку C # P / Invoke. Мне также пришлось создать обработчики для работы со встроенными объектами OLE, которые могут храниться в документах Notes, и извлечения хранимых данных из этих объектов OLE с помощью объектов Windows IStorage.

Примечание: я могу предоставить некоторые примеры позже (я должен переименовать пространства имен и обобщить код из-за проприетарных причин), но я создал классы-оболочки C # с помощью «Lotus C API Notes / Domino 8.5.2 Reference» NSF, предоставляемый IBM / Lotus (в виде загружаемого NSF). Используя определения C и ссылки на классы, я мог бы перевести их в вызовы C # P / Invoke и обернуть их в более удобные классы C #, которые затем вели себя как вызовы классов LotusScript, но внутри C #, а реализованные классы управляли и распоряжались своей памятью так, что все это не падает после того, как вы получили доступ к сотням тысяч документов из программы на C #. :)

1 голос
/ 23 декабря 2008

В тот день я бы порекомендовал N2N от Proposion, но этот продукт исчез с тех пор, как Quest приобрел Proposion.

Тем не менее, Proposion стал доказательством того, что вы можете безопасно обернуть Notes API в набор классов .Net. Вы можете найти информацию об этом в блоге Боба Балабана .

1 голос
/ 23 сентября 2008

Я работал над плагином Notes несколько месяцев назад, и да, API может быть невыносимым. Однако мне удалось заставить его работать, чтобы я мог получить доступ ко всей информации Notes с помощью приложения C # (фактически, так как я писал плагин, у меня был вызов Notes к приложению C # через мост C ++, который он зарегистрировал в запуск .ini файл). Некоторые методы, которые они документируют в своем API, на самом деле не работают, поэтому требуется много тестирования. Иногда вам нужно заняться гимнастикой кода ...

0 голосов
/ 22 октября 2010

Мне лично очень нравится Domino-оболочка .NET для COM API. Когда вы разрабатываете свой код C #, вы почти можете представить, что ваши мечты о правильной среде IDE стали реальностью. Но у него есть некоторые недостатки, например, для версии 6.5 (я не пробовал более новую), во многих случаях происходит сбой приложения, когда код LotusScript возвращает несоответствие типов для параметра. Но это, конечно, из-за ограничений COM.

В то же время оболочка не позволяет работать с классами NotesUI. Однако я использовал отражения из очень старых примеров Notes COM API для вызова классов NotesUI, и это сработало. Это было удобно, когда я разработал плагин для Outlook, который требовал взаимодействия с клиентским интерфейсом Notes. Мне также удалось создать простую оболочку для классов пользовательского интерфейса.

0 голосов
/ 21 августа 2009

Я бы лично сделал это в Notes в LotusScript или Java. Вы можете сделать запланированный агент в Notes намного проще, чем сервис в C #.

...