2012-02-22 63 views
1

我想在一個命令行應用程序使用SolrNet(或者更準確地說,從LINQPad)來測試一些疑問,並試圖初始化庫時,我得到以下錯誤:使用SolrNet從控制檯應用程序查詢Solr?

Key 'SolrNet.Impl.SolrConnection.UserQuery+Resource.SolrNet.Impl.SolrConnection' already registered in container 

然而,如果我抓住這個錯誤並繼續,在服務定位給了我以下錯誤:

​​

隨着內部異常:

The given key was not present in the dictionary. 

我的完整代碼如下所示:

try 
{ 
    Startup.Init<Resource>("http://localhost:8080/solr/"); 
    Console.WriteLine("Initialized\n"); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine("Already Initialized: " + ex.Message); 
} 

// This line causes the error if Solr is already initialized 
var solr = ServiceLocator.Current.GetInstance<ISolrOperations<Resource>>(); 

// Do the search 
var results = solr.Query(new SolrQuery("title:test")); 

我在安裝了Solr 3.4.0的Windows 7x64上運行Tomcat 7。

在StackOverflow上有another message about the same problem,儘管在Global.asax中放置Startup.Init代碼的接受答案只與ASP.NET相關。

重新啓動Tomcat7服務可解決問題,但必須在每次查詢之後執行此操作都很麻煩。

使用SolrNet庫從C#控制檯應用程序與Solr進行交互的正確方法是什麼?

回答

5

在一個控制檯應用程序中使用SolrNet正確的方法是隻爲您的控制檯應用程序的生命執行行

Startup.Init<Resource>("http://localhost:8080/solr/"); 

一次。我通常把它作爲我的主要方法的第一行,如下圖所示...

static void Main(string[] args) 
{ 
    Startup.Init<Resource>("http://localhost:8080/solr/"); 

    //Call method or do work to query from solr here... 
    //Using your code in a method... 
    QuerySolr(); 
} 

private static void QuerySolr() 
{ 
    var solr = ServiceLocator.Current.GetInstance<ISolrOperations<Resource>>(); 

    // Do the search 
    var results = solr.Query(new SolrQuery("title:test")); 
} 

你的錯誤是一個事實,即你正在嘗試多次初始化SolrNet連接未來。控制檯應用程序啓動時只需要初始化一次,然後在需要時通過ServiceLocator引用(查找)。

+0

如果是這樣,不應該在一個try/catch塊包裹Startup.Init的情況下解決該問題明確之前啓動?這樣,即使它被多次調用並導致'已在容器中註冊'錯誤,服務定位器仍然能夠獲取實例並允許其餘代碼正常運行。我目前在LINQPad中運行這個代碼,所以也許這是問題的一部分。我會試着將它作爲一個標準的控制檯應用程序運行,看看是否有任何改變。 – Mun 2012-02-22 16:43:03

+0

不一定,我猜測當你第二次初始化它時,你正在破壞入口並使其無法使用。 (但我不積極,因爲我不知道ServiceLocator IOC容器的內部工作原理)。因此,嘗試查詢時看到的激活錯誤。因此,捕捉異常並繼續進行,儘管它不起作用。 – 2012-02-22 16:47:23

+0

我確實相信在LINQPad中運行可能是問題的一部分,因爲我有大約10個使用SolrNet的不同控制檯應用程序而沒有任何問題。 – 2012-02-22 16:55:01

1

我的解決方案是初始化

Startup.Container.Clear(); 
Startup.InitContainer(); 
Startup.Init<Resource>("http://localhost:8080/solr/"); 
+0

這對我來說非常有用 - 尤其是我在LinqPad中使用它來查詢查詢。 – 2016-02-10 20:14:26

相關問題