与C#中的Lotus Notes交互的最佳方法和推荐做法是什么
特别是,我必须以最快,最可靠的方式从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类创建了一个简单的包装器。