Ответ HTTP запроса не передаётся корректно в переменную, но в лог выводится (общий код)

vedi108

Client
Регистрация
22.08.2022
Сообщения
16
Благодарностей
3
Баллы
3
Имеется C# кубик:
BybitApiWalletBalance.GetWalletBalanceAsync(project);

который вызывает код в Общем коде функцию:
C#:
class BybitApiWalletBalance
{
    private const string BaseUrl = "https://api.bybit.com";
    private const string ApiKey = "0000000000";
    private const string ApiSecret = "111111111111111111111";
    private static readonly HttpClient client = new HttpClient();



    public static async Task GetWalletBalanceAsync(IZennoPosterProjectModel project)
    {
        string accountType = "CONTRACT";
        string coin = "USDT";

        string endpoint = "/v5/account/wallet-balance";
        string parameters = $"accountType={accountType}&api_key={ApiKey}&coin={coin}&timestamp={DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()}";
        string sign = CreateSignature(ApiSecret, parameters);

        string url = $"{BaseUrl}{endpoint}?{parameters}&sign={sign}";
        HttpResponseMessage response = await client.GetAsync(url);
        string content = await response.Content.ReadAsStringAsync();

        project.Variables["tmp_2"].Value = Convert.ToString(content);
        project.SendInfoToLog(content, false);

    }

    private static string CreateSignature(string secret, string message)
    {
        byte[] keyByte = Encoding.UTF8.GetBytes(secret);
        byte[] messageBytes = Encoding.UTF8.GetBytes(message);
        using (var hmacsha256 = new HMACSHA256(keyByte))
        {
            byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
            return BitConverter.ToString(hashmessage).Replace("-", "").ToLower();
        }
    }
}
Так вот,при вызове функции, его ответ без ошибок выводится в лог (строка 24), но в переменную с ПЕРВОГО РАЗА не заносится, НО при повторном вызове функции, в лог выводится ответ второго запроса , а в переменную заносится ОТВЕТ из ПЕРВОГО ЗАПРОСА.

Помогите победить эту проблему. пробовал разные варианты, например, там же распарсить JSON, но опять таки распаршивается предыдущий запрос, а не последний.


Скрин первого запроса:
2024-02-17_230630.jpg



Скрин второго запроса
2024-02-17_231050.jpg
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
метод асинхронный. Вероятно, зенно вызывает его и идёт тут же дальше, не ожидая его выполнения

мб там есть синхронный ReadAsString
 

WalkODoff

Client
Регистрация
09.04.2016
Сообщения
149
Благодарностей
31
Баллы
28
C#:
class BybitApiWalletBalance
{
    private const string BaseUrl = "https://api.bybit.com";
    private const string ApiKey = "0000000000";
    private const string ApiSecret = "111111111111111111111";
    private static readonly HttpClient client = new HttpClient();

    public static async Task<string> GetWalletBalanceAsync(IZennoPosterProjectModel project)
    {
        string accountType = "CONTRACT";
        string coin = "USDT";

        string endpoint = "/v5/account/wallet-balance";
        string parameters = $"accountType={accountType}&api_key={ApiKey}&coin={coin}&timestamp={DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()}";
        string sign = CreateSignature(ApiSecret, parameters);

        string url = $"{BaseUrl}{endpoint}?{parameters}&sign={sign}";
        HttpResponseMessage response = await client.GetAsync(url);
        string content = await response.Content.ReadAsStringAsync();

        // project.Variables["tmp_2"].Value = Convert.ToString(content);
        project.SendInfoToLog(content, false);

        return content;
    }

    private static string CreateSignature(string secret, string message)
    {
        byte[] keyByte = Encoding.UTF8.GetBytes(secret);
        byte[] messageBytes = Encoding.UTF8.GetBytes(message);
        using (var hmacsha256 = new HMACSHA256(keyByte))
        {
            byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
            return BitConverter.ToString(hashmessage).Replace("-", "").ToLower();
        }
    }
}

В коде я закомментировал строку project.Variables["tmp_2"].Value = Convert.ToString(content);, которая записывает значение в глобальную переменную. Вместо этого я добавил в функцию возврат значения content типом Task<string>. Теперь эту функцию можно вызвать и получить результат каждого запроса отдельно.

Например, в вызывающей стороне ты можешь получить ответ каждого запроса следующим образом:


C#:
string responseContent1 = await BybitApiWalletBalance.GetWalletBalanceAsync(project);
string responseContent2 = await BybitApiWalletBalance.GetWalletBalanceAsync(project);

// ... обработка ответов для каждого запроса ...

Таким образом, каждый вызов функции GetWalletBalanceAsync будет давать отдельный результат без перезаписи предыдущего значения.
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)