在.NET中使用OpenTSDB HTTP api:400 Bad Request

时间:2016-04-25 19:20:49

标签: c# .net httpwebrequest httpclient opentsdb

我正在尝试使用.net将数据点放在OpenTSDB中,使用HTTP / api / put API。 我尝试过使用httpclient,webRequest和HttpWebRequest。结果总是400 - 错误请求:不支持分块请求。

我已经使用api测试仪(DHC)尝试了我的有效负载,效果很好。 我试图发送一个非常小的有效载荷(即使是错误的,如“x”),但回复总是一样的。

这是我的一个代码实例:

    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    ;
    }

我明确地将SendChunked属性设置为false。

请注意其他请求,例如:

 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;

        }

完美无瑕地工作。 我确信我做错了什么。 我想从头开始在套接字中重新实现HTTP。

1 个答案:

答案 0 :(得分:0)

我找到了一个我想在这里分享的解决方案。 我用过wireshark来嗅探我的数据包,我发现这个标题被添加了:

Expect: 100-continue\r\n

(见https://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html的8.2.3)

这是罪魁祸首。我已经阅读了Phil Haack的帖子http://haacked.com/archive/2004/05/15/http-web-request-expect-100-continue.aspx/,并发现HttpWebRequest默认放置该标头,除非你告诉它停止。在本文中,我发现使用ServicePointManager我可以做到这一点。

在声明http对象时,将以下代码置于我的方法之上,使其工作得很好,并解决了我的问题:

            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;