2

私は次のカールコードを持っています:

curl 'localhost:8983/solr/sessions/update?commit=true' -H 'Content-type:application/json' -d '[{"Session_SessionId":"da7007e9-fe7a-4bdf-b9e4-1a55034cf08f","Session_HasComments":{"set":true}}]'

C# に変換しようとしていますが、毎回エラーが発生するため、コードが正しいかどうかわかりません...

これが私がこれまでに持っているものです:

        string path = "http://localhost:8983/solr/sessions/update?commit=true";
        var httpWebRequest = (HttpWebRequest)WebRequest.Create(path);
        httpWebRequest.ContentType = "application/json";
        httpWebRequest.Method = "POST";

        using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
        {
            string json = "{\"Session_SessionId\":\"" + sessionId + "\"," +
                          "\"" + fieldName + "\":{\"set\":\"" + fieldValue + "\"}}";

            streamWriter.Write(json);
            streamWriter.Flush();
            streamWriter.Close();

            var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                var result = streamReader.ReadToEnd();
            }
        }

この行では常にエラー () のようです:

var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();

私が得るエラーは次のとおりです。

The remote server returned an error: (400) Bad Request.","StackTrace":"   at System.Net.HttpWebRequest.GetResponse()

何か案は?前もって感謝します!

デイブ

4

6 に答える 6

1

おそらく、リクエストにストリーミングしている JSON コンテンツの角かっこを削除したことでしょうか? [ ] をデータの先頭/末尾に追加してみてください。「BadRequest」は通常、HTTP リクエストの形式が正しくないことを示す非常に厳密なエラーですが、サーバーは実際には、おそらくここで発生したセッション ID の欠落など、他のケースでもそのコードを返す場合があります。

違いに注意してください:

-d '[{"Session_SessionId":"da70.....
    ^ bracket

string json = "{\"Session_SessionId\":\"" + sessionId + "\"," + ....
               ^ no bracket

データの末尾も同様です。
しかし、もちろん、それは単なる推測です。:)

于 2013-03-28T15:54:51.240 に答える
0

JSON オブジェクトで Update Handler を使用するには、 Update JSON - Update コマンドで説明されている JSON 形式に従う必要があります。

于 2013-03-28T16:06:07.977 に答える
0

デイブ、うまくいきました。

角かっこがありませんでした。それぞれの行を以下に置き換えるだけです:

文字列 json = "[{\"Session_SessionId\":\"" + sessionId + "\"," + "\"" + fieldName + "\":{\"set\":\"" + fieldValue + "\ "}}]";

于 2013-11-28T14:17:55.583 に答える
0

SolrNetを使用するだけです。Solr 4+ でこれを行う場合は、最新のコードをダウンロードして自分でビルドする必要がありますが、それは非常に簡単です。

于 2013-03-29T01:49:37.667 に答える
0

サーバーがリクエストを理解できません。json変数の出力を確認しましたか。JSON 文字列が正しく生成されていないと思います。

JavaScriptSerializer.Serializeを使用して JSON 文字列を作成してみませんか。

于 2013-03-28T16:05:07.230 に答える
0

別のユーザーが示唆しているように、JSON 出力は CURL と一致しません。テキストを入力するのではなく、次のことを試してください。

var data = new[]
{
    new
    {
        Session_SessionId = "da7007e9-fe7a-4bdf-b9e4-1a55034cf08f",
        Session_HasComments = new {set = true}
    }
};

var json = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(data);

また、usingキーワードを使用してデータを書き込み、ブロック内で応答を処理しようとしています。おそらく違いはありますが、これをこのブロックの外に移動する価値があるかもしれません。

最後に、データをバイト配列としてエンコードする必要がある場合があります。

上記の提案を実装するコードを次に示します。

string path = "http://localhost:8983/solr/sessions/update?commit=true";
var httpWebRequest = (HttpWebRequest)WebRequest.Create(path);
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "POST";

var data = new[]
{
    new
    {
        Session_SessionId = "da7007e9-fe7a-4bdf-b9e4-1a55034cf08f",
        Session_HasComments = new {set = true}
    }
};

string json = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(data);
byte[] byteData = new System.Text.ASCIIEncoding().GetBytes(json);

httpWebRequest.ContentLength = byteData.Length;
using (Stream stream = httpWebRequest.GetRequestStream())
{
   stream.Write(byteData,0,byteData.Length);
}

HttpWebResponse resp = (HttpWebResponse)httpWebRequest.GetResponse();
string respStr = new StreamReader(resp.GetResponseStream()).ReadToEnd();

Console.WriteLine("Response : " + respStr);
于 2013-03-28T16:35:49.120 に答える