Есть работающий метод Pyton:
response = requests.request('post', request_url, headers=headers, data=body)
здесь body строка json. Есть заголовок KC-API-SIGN, в котором зашифрована строка, body это часть этой строки.
Как сделать то же в C#? Чтобы послать строку HttpRequestMessage или в HttpClient ее надо преобразовать в new StringContent(body) или создать new FormUrlEncodedContent(new Dictionary<string, string>... Обратное преобразование меняет порядок пар в json, поэтому сервер сравнивая часть зашифрованной строки (body) c полученной строкой выдает ошибку, что неверна зашифрованная часть. Но эта часть точно такая же как в Python, я сравнивал. С другой стороны это стандартная вещь при посылке на сервер зашифрованного запроса. Как же его сделать в C#? Пытался упорядочивать пары по алфавиту, но это ничего не дало.
На всякий случай привожу 2 варианта запроса Post, который пробовал.
1:
string url = "https://openapi-sandbox.kucoin.com/api/v1/orders";
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, new Uri(url));
//...Тот же код, что в Питоне, проверял, только не добавляю заголовок, который тут быть не может request.Headers.Add("Content-Type", "application/json");
//пробовал и request.Content = new StringContent(body, Encoding.UTF8, "application/json");
request.Content = new StringContent(body);
HttpResponseMessage response = await httpClient.SendAsync(request).ConfigureAwait(false);
string message = await response.Content.ReadAsStringAsync();
//Сервер возвращает "{\"code\":\"400005\",\"msg\":\"Invalid KC-API-SIGN\"}"
2:
var client = new HttpClient();
//...Тот же код, что в Питоне, проверял, только не добавляю заголовок, который тут быть не может request.Headers.Add("Content-Type", "application/json");
var content = new FormUrlEncodedContent(new Dictionary<string, string>{{ "clientOid", clientOid.ToString() },{ "symbol","CRO-USDT" },{"price",34000.ToString() },
{ "side","buy" },{"size",0.001m.ToString(CultureInfo.InvariantCulture) },{ "timeInForce","GTC" },{"type","limit"}});
var result = await client.PostAsync("https://openapi-sandbox.kucoin.com/api/v1/orders", content);//
string resultContent = await result.Content.ReadAsStringAsync();
Безрезультатно пробовал и устаревший WebRequest. Можно установить IronPython, но видел код, спрятанный в nuget, на C#.