Ответ 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 684
Благодарностей
4 641
Баллы
113
метод асинхронный. Вероятно, зенно вызывает его и идёт тут же дальше, не ожидая его выполнения

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

WalkODoff

Client
Регистрация
09.04.2016
Сообщения
155
Благодарностей
33
Баллы
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 будет давать отдельный результат без перезаписи предыдущего значения.
 

DeepFarm

Seller
Регистрация
11.05.2023
Сообщения
117
Благодарностей
24
Баллы
18
122689


WalkODoff
doc
vedi108


Ребят, подскажите, почему я получаю эту ошибку, все сделал, как вы тут описали. Подскажите, пожалуйста.

1718059778164.png
122691
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Посмотреть вложение 122689

WalkODoff
doc
vedi108


Ребят, подскажите, почему я получаю эту ошибку, все сделал, как вы тут описали. Подскажите, пожалуйста.

Посмотреть вложение 122690 Посмотреть вложение 122691
потому что совет не рабочий. А точнее, не рабочий он конкретно для с# экшенов
 

DeepFarm

Seller
Регистрация
11.05.2023
Сообщения
117
Благодарностей
24
Баллы
18

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