2016-11-28 27 views
0

我嘗試在Web應用程序中使用內容查詢,但它引發異常「Lucene.Net.Store.AlreadyClosedException:此IndexReader已關閉」。請幫我解決這個問題。在Web應用程序中使用內容查詢的Sense/net

var startSettings = new RepositoryStartSettings 
     { 
      Console = Console.Out, 
      StartLuceneManager = true, // <-- this is necessary 
      IsWebContext = false, 
      PluginsPath = AppDomain.CurrentDomain.BaseDirectory, 
     }; 

     using (Repository.Start(startSettings)) 
     { 
      var resultQuery = ContentQuery.Query("+InTree:@0 + DisplayName:*@1*", null, folderPath, q); 

     } 
+0

我們無法重現該問題,能否請您告訴我們您正在使用SN版本?或者可以以某種方式分享整個應用程序? –

+0

作爲一個問題:你真的需要一個擁有自己索引的重型工具嗎?因爲如果可以的話,您可以使用通過REST API連接到門戶的Sense/Net Client庫,這是編寫SN工具的推薦方式。它仍然是你編寫的C#代碼,維護這樣的工具更簡單。 –

+0

我正在使用SN版本6.5.3。 我已經通過REST API使用Sense/Net客戶端,但我無法使用該方法來實現搜索功能。 所以我需要使用ContentQuery來搜索樹中的內容。 – dinhienhy

回答

0

從其他應用程序(應用程序域)連接到Sense/Net的推薦方式是通過REST API。維護和配置更簡單(唯一的例外是您在Sense/Net應用程序本身內部工作,或者您只有一個應用程序,並且您不想從其他任何地方訪問Sense/Net,而您願意處理Sense/Net的本地索引以及它需要的所有配置值等)。

通過REST API連接並不意味着您必須手動發送HTTP請求(儘管這也不是很複雜):有一個.Net客戶端庫它可以幫助您。您可以訪問所有內容元數據或二進制文件通過客戶端,你可以上傳文件,查詢內容,管理權限等

// loading a content 
dynamic content = await Content.LoadAsync(id); 
DateTime date = content.BirthDate; 

// querying 
var results = await Content.QueryAsync(queryText); 

要在網絡應用程序中使用它,您必須執行以下操作:

  • 在應用程序生命週期開始時(例如,)初始化客戶端上下文一次。應用程序啓動)
  • 如果您需要以當前登錄用戶的名義向Sense/Net發出請求(例如,因爲您想查詢她可訪問的文檔),那麼您必須創建一個新的ServerContext對象爲每個用戶提供該用戶的用戶名/密碼,並將此對象提供給任何客戶端調用(例如加載或保存內容方法)。
var sc = new ServerContext 
{ 
    Url = "http://example.com", 
    Username = "user1", 
    Password = "asdf" 
}; 

var content = await Content.LoadAsync(id, sc); 
相關問題