我想在一個命令行應用程序使用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進行交互的正確方法是什麼?
如果是這樣,不應該在一個try/catch塊包裹Startup.Init的情況下解決該問題明確之前啓動?這樣,即使它被多次調用並導致'已在容器中註冊'錯誤,服務定位器仍然能夠獲取實例並允許其餘代碼正常運行。我目前在LINQPad中運行這個代碼,所以也許這是問題的一部分。我會試着將它作爲一個標準的控制檯應用程序運行,看看是否有任何改變。 – Mun 2012-02-22 16:43:03
不一定,我猜測當你第二次初始化它時,你正在破壞入口並使其無法使用。 (但我不積極,因爲我不知道ServiceLocator IOC容器的內部工作原理)。因此,嘗試查詢時看到的激活錯誤。因此,捕捉異常並繼續進行,儘管它不起作用。 – 2012-02-22 16:47:23
我確實相信在LINQPad中運行可能是問題的一部分,因爲我有大約10個使用SolrNet的不同控制檯應用程序而沒有任何問題。 – 2012-02-22 16:55:01