与C#中的Lotus Notes交互的最佳方法和推荐做法是什么

时间:2020-03-05 18:48:00  来源:igfitidea点击:

特别是,我必须以最快,最可靠的方式从Lotus Notes文件中提取所有消息和附件。可能相关的另一点是,我需要从辅助线程执行此操作。

编辑

感谢回答,两个都很好。我应该提供更多背景信息。

当前,我们有一个WinForms应用程序,该应用程序具有使用Notes COM API的后台线程。

但是,这似乎是不稳定的。 (当然,这可能是我们做错了。)例如,我们发现我们必须在主线程上预先初始化Notes会话,否则在后台线程上对session.CreateDXLExporter()的调用将引发异常。

解决方案

回答

看一下NotesSQL:

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

回答

如果在同一台计算机上安装了Domino / Lotus Notes客户端,则可以使用COM。只需在"通过COM访问Domino对象"上进行Google搜索,我们就会找到几乎所有版本的Domino的Domino Designer帮助条目。

我们也可以通过C API访问Domino,但不建议这样做。很乱。我们还仍然需要安装Domino / Lotus Notes客户端。

如果我们没有在同一台机器上安装Domino / Lotus Notes客户端,并且Domino服务器正在运行http,则也可以通过http来执行。这不会很快。我们可能还希望在Domino服务器上设置一些自定义的http视图,以使生活更轻松。

回答

我们可以使用Java或者LotusScript创建Domino Web服务。然后使用C来访问Web服务。

我只做过一次,就可以从Lotus Notes数据库中读取数据到另一台计算机上运行的.NET应用程序中。

编写和测试简单的Web服务
http://www.ibm.com/developerworks/lotus/library/web-services2/

当我发现一些时间时,我将写一个完整的示例:-)

回答

不久前,我在一个Notes插件上工作了几个月,是的,API可能令人发疯。但是,我能够使其工作,因此我可以使用C应用程序访问所有Notes信息(实际上,由于我正在编写插件,因此我通过在启动中注册的C ++桥接器将Notes调出到Capp中。 ini文件)。他们在API中记录的某些方法实际上无法使用,因此需要进行大量测试。有时候你必须做一些代码体操...

回答

可以在这里找到Lotus Notes COM Api参考

要在VB.Net中获得Notes会话(起点),可以使用:

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

我通常使用C#编程,以便与COM配合使用,我更喜欢VB.Net

最好从同一线程访问所有COM服务器,除非我们确定这样做不会造成任何麻烦。

回答

以前我会从Proposion推荐N2N,但是自从Quest收购Proposion以来,该产品已经不复存在。

就是说,Proposion证明我们可以安全地将Notes API包装在一组.Net类中。我们可以在Bob Balaban的博客中找到一些相关信息。

回答

我本人会在LotusScript或者Java的Notes中亲自进行此操作。与使用C#中的服务相比,在Notes中进行计划的代理要容易得多。

回答

我真的很讨厌NotesSession COM对象。

除了已初始化的线程,我们不能在其他线程中使用它。
.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()

那些是你的朋友。

干杯!

回答

我个人非常喜欢Domino包装的用于COM API的.NET程序集。当我们开发Ccode时,我们几乎可以想象到关于适当的Notes IDE的梦想成真。但是它有一些缺点,例如对于6.5版本(我没有尝试过更新),在许多情况下,当LotusScript代码返回参数的类型不匹配时,应用程序会崩溃。但这当然是由于COM的限制。

同时,包装器不允许使用NotesUI类。但是,我使用了非常古老的Notes COM API示例中的反射来调用NotesUI类,并且可以正常工作。当我开发需要与Notes客户端UI进行交互的Outlook插件时,它很方便。我也设法为UI类创建了一个简单的包装器。