Каков наилучший способ и рекомендуемые методы взаимодействия с Lotus Notes из С#

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

Изменить

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

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

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


person Phil Haselden    schedule 05.09.2008    source источник


Ответы (10)


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

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

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

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().

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

Ваше здоровье !

person Alex Rouillard    schedule 16.07.2010
comment
Алексей, очень интересный ответ. Я посмотрю на это дальше. Спасибо. Кстати, я не нашел ничего, что указывало бы на то, что потоки .Net являются волокнами, хотя я видел некоторые документы, в которых говорилось, что мы не должны предполагать, что потоки .Net имеют сопоставление 1-к-1 с неуправляемыми потоками ОС. - person Phil Haselden; 21.07.2010
comment
Это не настоящие волокна, такие как Python или Ruby, это управляемые потоки. Вот почему основной поток ОС может измениться в любое время. - person Alex Rouillard; 21.07.2010

Справочник по Lotus Notes COM Api можно найти здесь

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

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

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

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

person GvS    schedule 22.10.2008

Взгляните на NotesSQL:

http://www.ibm.com/developerworks/lotus/products/notesdomino/notessql/

person Joshua Turner    schedule 05.09.2008
comment
Есть идеи, можно ли это использовать для получения элементов в собственном формате, таком как .dxl (без необходимости самостоятельно создавать XML)? - person Phil Haselden; 18.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, чтобы облегчить себе жизнь.

person Jeff Bonnes    schedule 08.09.2008

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

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

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

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

person Eric Labashosky    schedule 16.09.2008
comment
Привет, Эрик... Прямо сейчас я использую взаимодействие, но думаю переключиться на веб-службу. Для использования взаимодействия необходимо установить Lotus Notes на эту машину. То же самое и с веб-сервисом? Спасибо - person om471987; 24.04.2012
comment
Нет, вы вызываете веб-службу на сервере Domino, и я полагаю, что эта функция встроена в Notes 7.0. Таким образом, вам не нужно устанавливать клиент Notes локально, откуда вы вызываете веб-службу. - person Karl-Henry Martinsson; 26.11.2012

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

person Sam Schutte    schedule 23.09.2008

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

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

person Peter T. LaComb Jr.    schedule 23.12.2008

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

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

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

Классы, которые я реализовал на С# (которые мне только нужны) из 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 #. :)

person Brien Halstead    schedule 09.04.2016
comment
Дайте мне знать, если вам нужны источники того, что было описано выше. Я не могу прикрепить их сюда и не хочу указывать общедоступный FTP-адрес. - person Brien Halstead; 09.04.2016
comment
Спасибо @Брайен-Халстед. У меня нет текущей потребности в коде, но было бы неплохо иметь его для дальнейшего использования. Пишите мне в твиттер (см. мой профиль). - person Phil Haselden; 11.04.2016

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

person Martin Murphy    schedule 21.08.2009

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

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

person Alexey Zimarev    schedule 22.10.2010