Подтвердить что ты не робот

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

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

Edit

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

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

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

4b9b3361

Ответ 1

Я действительно ненавижу этот 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()

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

Приветствия!

Ответ 2

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

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

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

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

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

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

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

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

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

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

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

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

Ответ 9

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

Ответ 10

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

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