2016-04-25 20 views
0

Ich versuche mit. NET, um Datenpunkte in OpenTSDB setzen, mit der HTTP/API/Put-API. Ich habe versucht mit httpclient, webRequest und HttpWebRequest. Das Ergebnis ist immer 400 - schlechte Anfrage: Chunked-Anfrage wird nicht unterstützt.mit OpenTSDB HTTP API in. NET: 400 Bad Request

Ich habe meine Nutzlast mit einem api-Tester (DHC) versucht und funktioniert gut. Ich habe versucht, eine sehr kleine Nutzlast zu senden (sogar einfach falsch, wie "x"), aber die Antwort ist immer die gleiche.

Hier ist eine meiner Code-Instanzen:

public async static Task PutAsync(DataPoint dataPoint) 
    { 
     try 
     { 
      HttpWebRequest http = (HttpWebRequest)WebRequest.Create("http://127.0.0.1:4242/api/put"); 
      http.SendChunked = false; 
      http.Method = "POST"; 

      http.ContentType = "application/json"; 

      Encoding encoder = Encoding.UTF8; 
      byte[] data = encoder.GetBytes(dataPoint.ToJson() + Environment.NewLine); 
      http.Method = "POST"; 
      http.ContentType = "application/json; charset=utf-8"; 
      http.ContentLength = data.Length; 
      using (Stream stream = http.GetRequestStream()) 
      { 
       stream.Write(data, 0, data.Length); 
       stream.Close(); 
      } 

      WebResponse response = http.GetResponse(); 

      var streamOutput = response.GetResponseStream(); 
      StreamReader sr = new StreamReader(streamOutput); 
      string content = sr.ReadToEnd(); 
      Console.WriteLine(content); 
     } 
     catch (WebException exc) 
     { 
      StreamReader reader = new StreamReader(exc.Response.GetResponseStream()); 
      var content = reader.ReadToEnd(); 
     } 

        return ; 
    } 

, wo ich falsch die SendChunked Eigenschaft explizit festgelegt.

zu beachten, dass andere Anforderungen, wie:

public static async Task<bool> Connect(Uri uri) 
     { 
      HttpWebRequest http = (HttpWebRequest)WebRequest.Create("http://127.0.0.1:4242/api/version"); 
      http.SendChunked = false; 
      http.Method = "GET"; 
      // http.Headers.Clear(); 
      //http.Headers.Add("Content-Type", "application/json"); 
      http.ContentType = "application/json"; 
      WebResponse response = http.GetResponse(); 

      var stream = response.GetResponseStream(); 
      StreamReader sr = new StreamReader(stream); 
      string content = sr.ReadToEnd(); 
      Console.WriteLine(content); 
      return true; 

     } 

Arbeit einwandfrei. Ich bin mir sicher, dass ich etwas wirklich falsch mache. Ich möchte HTTP in Sockets von Grund auf neu zu implementieren.

Antwort

0

Ich habe eine Lösung gefunden, die ich hier teilen möchte. Ich habe wireshark verwendet meine Pakete zu riechen, und ich habe festgestellt, dass dieser Header hinzugefügt:

Expect: 100-continue\r\n 

(siehe 8.2.3 von https://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html)

Dies ist der Schuldige. Ich habe den Post http://haacked.com/archive/2004/05/15/http-web-request-expect-100-continue.aspx/ von Phil Haack gelesen, und festgestellt, dass HttpWebRequest standardmäßig diesen Header setzt, es sei denn, Sie sagen es zu stoppen. In diesem Artikel habe ich festgestellt, dass ich mit ServicePointManager genau das tun kann.

den folgenden Code auf meiner Methode Einlochen, wenn das http Objekt deklariert, ist es sehr gut arbeiten läßt, und löst mein Problem:

  var uri = new Uri("http://127.0.0.1:4242/api/put"); 
      var spm = ServicePointManager.FindServicePoint(uri); 
      spm.Expect100Continue = false; 
      HttpWebRequest http = (HttpWebRequest)WebRequest.Create(uri); 
      http.SendChunked = false; 
Verwandte Themen