Библиотека классов, выполняющая вызов API, не работает в определенных проектах - PullRequest
1 голос
/ 15 октября 2019

У меня есть библиотека классов для общения с API-сервером журналирования, метод "chain" такой:

Точка входа ->

 private static bool SendChecksumToServer(Checksum checksum)
    {
        var res = _api.GetAsync($"Checksum?assemblyName={checksum.CurrentAssembly}&checkSum={checksum.LogFileChecksum}&fileName={checksum.FileName}");
        return _api.Deserialize<bool>(res.Result.Content.ReadAsStringAsync().Result);
    }

Который вызывает это:

public async Task<HttpResponseMessage> GetAsync(string apiCall)
    {
        ApiGet get = new ApiGet();
        return await get.GetAsync(apiCall, client);
    }

Что вызывает это:

 public async Task<HttpResponseMessage> GetAsync(string apiCall, HttpClient client)
    {
        var response = await client.GetAsync(apiCall);
        return response;
    }

Это прекрасно работает, когда я использую библиотеку классов в консольном приложении, но как только я перемещаю ее в реальное приложение (MVC)он перестает работать, он даже не воздействует на действие контроллера, я перепробовал все, что мог придумать, например, проверить брандмауэры, убедиться, что асинхронность верна (хотя я уверен, что это не так, потому что API неОтвечая, приложение зависает, но я не могу дать пузырь асинхронности выше)

1 Ответ

0 голосов
/ 15 октября 2019

Скорее всего, возникла тупиковая ситуация из-за .Result блокировки вызова.

Не смешивайте код блокировки и асинхронный код

Ссылка Асинхронизация / ожидание -Лучшие практики в асинхронном программировании

Измените код, чтобы он был асинхронным полностью

private static async Task<bool> SendChecksumToServer(Checksum checksum) {
    var res = await _api.GetAsync($"Checksum?assemblyName={checksum.CurrentAssembly}&checkSum={checksum.LogFileChecksum}&fileName={checksum.FileName}");
    String data = await res.Result.Content.ReadAsStringAsync();
    return _api.Deserialize<bool>(data);
}

Убедитесь, что все, что когда-либо вызывается SendChecksumToServer, также ожидает задачи,

а также не использовать async-await в других вызовах, если ничего не нужно ожидать.

public Task<HttpResponseMessage> GetAsync(string apiCall) {
    ApiGet get = new ApiGet();
    return get.GetAsync(apiCall, client);
}

ApiGet

public Task<HttpResponseMessage> GetAsync(string apiCall, HttpClient client) {
    return client.GetAsync(apiCall);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...