2010-06-08 69 views
8

我有針對out solr索引運行的查詢,有時會有很長的查詢參數,我運行這些查詢時遇到錯誤,達到GET查詢參數的限制。您可以使用POST在Solr中運行查詢(/ select)

這裏是我用來查詢的方法(JSON),這是爲了說明我正在使用Http Extensions(我使用的客戶端是HttpClient的薄包裝器)而不是端到端的解決方案。 90%的查詢運行良好,只是當參數很大時,我從solr獲得500錯誤。我已經閱讀過某處可以使用POSt的地方,但還沒有找到如何去做的例子。任何幫助將是太棒了!

public string GetJson(HttpQueryString qs) 
    { 
     using (var client = new DAC.US.Web.XmlHttpServiceClient(this.Uri)) 
     { 
      client.Client.DefaultHeaders.Authorization = new Microsoft.Http.Headers.Credential("Basic", DAC.US.Encryption.Hash.WebServiceCredintials); 
      qs.Add("wt", "json"); 

      if (!String.IsNullOrEmpty(this.Version)) 
       qs.Add("version", this.Version); 

      using (var response = client.Get(new Uri(@"select/", UriKind.Relative), qs)) 
      { 
       return response.Content.ReadAsString(); 
      } 
     } 
    } 

回答

12
  1. 不要假設。檢查Solr日誌以確認此錯誤的原因。
  2. /select接受POST請求沒有問題。你可以用捲髮試試這個:

    curl -d "q=*:*&rows=1" http://localhost:8983/solr/select 
    

    ,因爲它似乎是一些專有代碼我不能XmlHttpServiceClient發表評論,但看到this page使用HttpWebRequest的一個張貼的例子。

順便說一句:有.net庫實現與Solr通信,除非你有一些非常奇怪的需求,否則不需要自己推出。

+0

我使用不使用HttpWebRequest,技術上,我使用了一個瘦包裝Microsoft.Http庫。我有相當多的要求,我發現使用SolrNet等實現起來更加困難。我想我的主要問題是,這是POST參數數據等於GET的查詢字符串的樣子。從你的捲曲的例子看來,這個帖子需要1個參數... – RyanFetz 2010-06-09 11:26:19

+1

@RyanFetz:是的,POST數據和查詢字符串一樣。 – 2010-06-09 12:36:03

+0

@RyanFetz:順便說一句我有興趣聽到有關SolrNet的這些困難:-) – 2010-06-20 05:10:00

4

一定要設置內容類型:應用程序/ x-WWW窗體-urlencoded或者你會得到500

捲曲默認完成了這些狀態代碼。

如果您的XmlHttpServiceClient是硬編碼/默認使用text/xml作爲內容類型,那不會讓我感到意外。 HttpWebRequest更合適。

+0

我花了很多時間試圖弄清爲什麼這篇文章不適合我。我終於明白了,然後閱讀你的迴應。這會教會我不檢查其他答案。 – 2014-04-28 15:13:40

0

Solr支持HTTP GET和HTTP POST。

在執行HTTP POST時,正確設置了內容類型。 您可以使用郵遞員或提琴手驗證它。

正確的內容類型: 內容類型:application/x-www-form-urlencoded。

不正確的內容類型,你會得到錯誤信息爲 :遠程服務器返回錯誤:(400)錯誤的請求

相關問題