在通过注释URL解析文档时,Notes会话返回NotesView而不是NotesDocument

时间:2012-07-06 14:09:51

标签: .net lotus-notes

我正在使用Domino .NET包装器类来允许用户将电子邮件从Lotus收件箱拖到winform。

我正在获取一个数据对象,其中包含文档的注释URL,格式为

notes://server/replicaID/viewID/documentUNID

并将其传递给Domino.NotesSession.Resolve(pUrl),它应该返回匹配的文档。实际上,在我的浏览器中粘贴链接(替换注释://通过http://就像一个魅力,我得到了电子邮件的HTML版本)。

但Resolve方法继续返回似乎是NotesView的东西,而不是实际的文档:

Dim notesSession as Domino.NotesSession = ' ...  Initialize session here
Dim notesURL as string = "notes://server/replicaID/viewId/documentID"

Dim draggedDocument = notesSession.Resolve(notesURL)
' Here, I do get an actual document, but its UnID matches the viewId 
' part of the url, not the document.

我尝试从网址中删除viewID,但没有取得更多成功。我找到成功检索文档的唯一方法是使用OLE对象(lotus名称空间):

' Get UnId from url
Dim unid as String = notesURL.Split("/").Last()

' Get UI Automation object
Dim workspace = CreateObject("Notes.NotesUIWorkspace")
' Get currently open DB (the where the drag event was initiated)
Dim notesDb = workspace.CURRENTDATABASE.Database
' Retrieve matching document
Dim notesDoc = notesDb.GetDocumentByUNID(unid)

虽然这种方法有效,但我不想使用UI自动化类(OLE),而是使用Domino的COM包装器(.NET)。

那么这些注释URL如何在互操作中起作用?有没有办法在不知道数据库的情况下直接检索匹配的文档?为什么Resolve方法在给定文档URL时会返回视图对象?

欢迎任何帮助。

2 个答案:

答案 0 :(得分:2)

听起来你正在处理Resolve方法中的错误。但你的第二个想法似乎是一个合理的解决方法。但是,我不认为有必要拨打CreateObject。包装类应该可以正常工作。

您在第一个代码示例(Domino.NotesSession对象)中有NotesSession,因此您应该能够在其上调用Resolve方法,以根据您拥有的NotesUrl检索数据库对象。您不一定需要获取视图,只需要获取数据库对象。然后,您可以从该对象调用GetDocumentByUNID方法来检索所需的文档。如果Resolve方法为你做到这一点会很好,但听起来它会让你足够接近。

Dim notesSession as Domino.NotesSession =  <Session>
Dim notesURL as string = "notes://server/replicaID"    
Dim notesDocUNID as string = "parse URL to get the UNID"

Dim notesDatabase = notesSession.Resolve(notesURL)
Dim document = notesDatabase.GetDocumentByUNID(notesDocUNID)

答案 1 :(得分:0)

Session.resolve不返回NotesDocument。它返回一个通用对象(在我的脑海中,我会说Base - 所有Notes数据对象的基类)。您必须相应地调暗变量,然后检查类型并将其转换为文档