2008-09-05 30 views
16

Cụ thể, tôi phải trích xuất tất cả thư và tệp đính kèm từ tệp Lotus Notes theo cách nhanh nhất và đáng tin cậy nhất. Một điểm khác có thể liên quan là tôi cần làm điều này từ một chuỗi thứ cấp.Cách tốt nhất và thực hành được khuyến nghị để tương tác với Lotus Notes từ C#

Sửa

Cảm ơn câu trả lời - cả hai đều là tốt. Tôi nên cung cấp thêm thông tin cơ bản.

Hiện tại, chúng tôi có ứng dụng WinForms có chủ đề nền sử dụng API Ghi chú COM.

Tuy nhiên, dường như nó không ổn định. (Tất nhiên nó có thể là chúng ta đang làm điều gì đó sai.) Ví dụ, chúng tôi đã tìm thấy chúng tôi phải preinitialize phiên ghi chú về chủ đề chính hoặc người nào khác cuộc gọi đến session.CreateDXLExporter() trên nền thread ném một ngoại lệ.

Trả lời

2

Nếu bạn có một Domino/Lotus Notes client được cài đặt trên cùng một máy, bạn có thể sử dụng COM. Chỉ cần thực hiện tìm kiếm trên Google về 'Truy cập các đối tượng Domino qua COM' và bạn sẽ tìm thấy mục trợ giúp Domino Designer để biết về bất kỳ phiên bản Domino nào.

Bạn cũng có thể truy cập Domino qua API C nhưng sẽ không đề xuất. Rất bừa bộn. Bạn cũng cần cài đặt ứng dụng Domino/Lotus Notes.

Nếu bạn làm không có ứng dụng khách Domino/Lotus Notes được cài đặt trên cùng một máy và máy chủ Domino đang chạy http, bạn cũng có thể thực hiện điều đó qua http. Điều này sẽ không gần như nhanh. Bạn cũng có thể muốn một số thiết lập chế độ xem http tùy chỉnh trên máy chủ Domino để làm cho cuộc sống của bạn dễ dàng hơn.

2

Bạn có thể tạo dịch vụ web Domino bằng Java hoặc LotusScript. Sau đó sử dụng C# để truy cập dịch vụ web.

Tôi chỉ thực hiện thao tác này một lần, để đọc dữ liệu từ một API Lotus Notes thành một ứng dụng .NET chạy trên một máy khác.

Viết và thử nghiệm các dịch vụ Web đơn giản http://www.ibm.com/developerworks/lotus/library/web-services2/

khi tôi tìm thấy một số thời gian tôi sẽ viết một ví dụ hoàn chỉnh :-)

+0

Hi Eric ... Ngay bây giờ tôi đang sử dụng interop nhưng suy nghĩ để chuyển sang dịch vụ Web. Để sử dụng interop, cần cài đặt Lotus Notes trên máy đó. Có phải cùng một trường hợp với Dịch vụ Web không? Cảm ơn – om471987

+0

Không, bạn gọi một dịch vụ web trên máy chủ Domino và chức năng đó được tích hợp trong Ghi chú 7.0, tôi tin tưởng. Vì vậy, bạn không cần ứng dụng Notes được cài đặt cục bộ, từ nơi bạn đang gọi dịch vụ web. –

1

tôi đã làm việc trên một plugin Ghi chú trong vài tháng một thời gian ngắn trở lại, và có , API có thể gây phiền toái. Tuy nhiên, tôi có thể làm cho nó hoạt động để tôi có thể truy cập tất cả thông tin ghi chú bằng ứng dụng C# (thực tế, vì tôi đang viết một plugin, tôi đã ghi chú gọi ra ứng dụng C# thông qua cầu C++ mà nó đã đăng ký trong một tệp .ini khởi động). Một số phương pháp nhất định mà chúng ghi lại trong API của chúng thực sự không hoạt động, vì vậy cần phải có rất nhiều thử nghiệm. Đôi khi bạn phải làm một số thể dục dụng cụ mã ...

3

Một Lotus Notes COM Api tham khảo có thể được tìm thấy here

Để có được một ghi chú phiên (Điểm khởi đầu) trong VB.Net bạn có thể sử dụng:

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

Tôi thường lập trình bằng C#, để hoạt động với COM tôi thích VB.Net

Tốt hơn là truy cập tất cả máy chủ COM từ cùng một chuỗi, trừ khi bạn chắc chắn rằng sẽ không gây ra bất kỳ sự cố nào.

1

Quay lại ngày tôi đã đề xuất N2N từ Đề xuất, nhưng sản phẩm đó đã đi kể từ khi Quest giành được Đề xuất.

Điều đó nói rằng, Đề xuất là bằng chứng cho thấy bạn có thể gói API ghi chú trong một tập hợp các lớp .Net một cách an toàn. Bạn có thể tìm thấy một số thông tin về điều đó trong Bob Balaban's blog.

0

Cá nhân tôi sẽ thực hiện việc này trong Ghi chú trong LotusScript hoặc Java. Bạn có thể thực hiện một tác nhân được lên lịch trong Ghi chú dễ dàng hơn nhiều so với dịch vụ trong C#.

6

Tôi thực sự ghét đối tượng NotesSession COM.

Bạn không thể sử dụng nó trong một chuỗi khác với chuỗi được khởi tạo. Các chủ đề trong .NET là các sợi, chuỗi cơ bản thực sự có thể thay đổi bất cứ lúc nào.

Vì vậy, tôi đề nghị sử dụng nó theo cách này, trong một sử dụng khối:

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 

Thông báo các Thread.BeginThreadAffinity() và Thread.EndThreadAffinity()

Đó là bạn bè.

Chúc mừng!

+0

Câu trả lời rất thú vị Alex. Tôi sẽ xem xét thêm về điều này. Cảm ơn. BTW, tôi đã không tìm thấy bất cứ điều gì mà nói rằng chủ đề .Net là sợi, mặc dù tôi đã thấy một số doco nói rằng chúng ta không nên giả định. Net đề có một bản đồ 1-to-1 cho các chủ đề OS không quản lý. –

+0

Đó không phải là các sợi * thực * như Python hay Ruby, đó là các chuỗi được quản lý. Đó là lý do tại sao chuỗi hệ điều hành cơ bản có thể thay đổi bất cứ lúc nào. –

0

Cá nhân tôi rất thích gói Domino được lắp ráp .NET cho API COM. Khi bạn phát triển mã C#, bạn hầu như có thể tưởng tượng được giấc mơ của mình về một IDE Ghi chú thích hợp đã trở thành sự thật. Nhưng nó có một số nhược điểm như đối với phiên bản 6.5 (tôi chưa thử phiên bản mới hơn), bạn bị treo ứng dụng trong nhiều trường hợp khi mã LotusScript trả về kiểu không khớp cho tham số. Nhưng điều này là do hạn chế COM của khóa học.

Đồng thời trình bao bọc không cho phép làm việc với các lớp NotesUI. Tuy nhiên tôi đã sử dụng phản ánh từ các ví dụ Notes API API rất cũ để gọi các lớp NotesUI và nó hoạt động. Thật tiện lợi khi tôi phát triển một plug-in Outlook yêu cầu tương tác với giao diện người dùng của ứng dụng Notes. Tôi đã tạo ra một trình bao bọc đơn giản cho các lớp UI.

1

Tôi biết chủ đề này cũ, nhưng tôi đã làm việc rất nhiều với Domino API và các đối tượng Notes LotusScript thông thường thông qua API Domino COM.

Vấn đề với Domino API là quản lý bộ nhớ qua COM là khủng khiếp (nếu sử dụng API trong C#, hoặc VB, v.v.), và nó sẽ gây rò rỉ bộ nhớ và cuối cùng gây ra toàn bộ API và ứng dụng Ghi chú sụp đổ (ngay cả khi bạn không mở ứng dụng khách, bạn sẽ không thể khởi động nó sau khi API bị treo mà không cần khởi động lại máy tính của bạn hoặc gọi "nsd -kill"). Vui vẻ.

Tôi nhận thấy rằng việc sử dụng API Notes C trong C# thông qua P/Invoke, bạn có thể quản lý tài nguyên bộ nhớ tốt hơn để API không gây rò rỉ bộ nhớ khủng khiếp và treo. Tôi đã viết một wrapper một phần trong C#, sử dụng P/Invoke, truy cập vào Notes C API từ notes.dll. Việc sử dụng nó không liên quan gì đến việc cố gắng làm việc trong môi trường Domino, nhưng để sử dụng hội đồng Ghi chú để có quyền truy cập vào các tệp NSF để trích xuất thông tin DXL trong môi trường C#. Rõ ràng, bạn sẽ cần phải có khách hàng ghi chú được cài đặt để có quyền truy cập vào notes.dll và API C. Nhưng C# của tôi wrapper của Notes C API hoạt động rất tốt và ổn định hơn so với Domino COM API được cung cấp khi bạn cài đặt ứng dụng Notes.

Các lớp mà tôi đã thực hiện trong C# (mà tôi đã chỉ cần thiết) từ API Thuyết minh C là:

NotesSession (như NotesRuntime) NotesDatabase NotesNote NotesItem NotesDXLExporter NotesNoteCollection

Cũng như một số lớp tạm thời, enums, và cấu trúc để xử lý các bản dịch từ C API vào C#.

Các lớp học mà tôi đã triển khai cho đến nay đã phục vụ các mục đích mà tôi cần từ API Notes C. Họ chắc chắn có thể được mở rộng, nhưng tôi đã không cố gắng để đóng gói toàn bộ API trong C# P/Invoke wrapper. Tôi cũng phải tạo các trình xử lý để xử lý các đối tượng nhúng OLE có thể được lưu trữ trong các tài liệu Ghi chú và nhận dữ liệu được lưu trữ từ các đối tượng OLE đó, sử dụng các đối tượng Windows IStorage. Lưu ý: Tôi có thể cung cấp một số mẫu sau này (tôi phải đổi tên không gian tên và tổng quát mã, vì lý do độc quyền), nhưng tôi đã tạo các lớp trình bao bọc C# bằng cách sử dụng "Lotus C API Notes/Domino 8.5.2 Reference "NSF được cung cấp bởi IBM/Lotus (dưới dạng NSF có thể tải xuống). Sử dụng các định nghĩa C và các tham chiếu lớp, tôi có thể dịch chúng thành C# P/Invoke calls và bọc chúng vào các lớp C# thân thiện hơn, sau đó hoạt động giống như các cuộc gọi lớp LotusScript, nhưng trong C#, và các lớp được triển khai quản lý và xử lý bộ nhớ của chúng rằng toàn bộ điều không sụp đổ sau khi bạn đã truy cập hàng trăm ngàn tài liệu từ một chương trình C#. :)

+0

Hãy cho tôi biết nếu bạn muốn nguồn của những gì đã được mô tả ở trên. Tôi không thể đính kèm chúng ở đây, cũng như tôi không muốn cung cấp địa chỉ FTP công khai. –

+0

Cảm ơn @ Brien-Halstead. Tôi không có một nhu cầu hiện tại cho mã nhưng nó sẽ là tốt để có để tham khảo trong tương lai. Cảm thấy tự do để DM tôi trên twitter (xem hồ sơ của tôi). –

Các vấn đề liên quan