Flurl создает FlurlHttpException вместо FlurlHttpTimeoutException - PullRequest
0 голосов
/ 29 апреля 2020

Мне нужно обрабатывать тайм-аут как особый случай, но flurl не дает ожидаемого исключения в некоторых случаях.

Вот мой упрощенный код для этого.

try
{           
    // Call Listener here with the result of the process
    using (IFlurlClient flurlClient = new FlurlClient(Url))
    {
        string response = await flurlClient
            .Configure(s => s.Timeout = TimeSpan.FromSeconds(130))
            .WithOAuthBearerToken(accessToken)
            .Request()
            .PostJsonAsync(result)
            .ReceiveString();

        Logger.LogInformation(response);
        ListenerResponse listenerResponse = JsonConvert.DeserializeObject<ListenerResponse>(response);
        Logger.LogInformation(listenerResponse.Success.ToString());

        if (!listenerResponse.Success)
        {
            throw new RejectedException("Listener rejected the request.");
        }
    }
}
catch (FlurlHttpTimeoutException ex)
{
    // throws with this message: "Call timed out: POST https://..."
    Logger.LogError(ex, $"Could not reach to Listener at: {Url}.");
    throw;
}
catch (FlurlHttpException ex)
{
    // throws with this message: "Call failed. Connection timed out POST https://..."
    Logger.LogError(ex, ex.Message); 
    throw;
}

Что происходит, когда я устанавливаю тайм-аут ниже определенного значения ( <130 </strong>), flurl выбрасывает ожидаемое FlurlHttpTimeoutException. Но если я установлю тайм-аут выше этого значения (> = 130 ), flurl на этот раз выдаст более общий FlurlHttpException.

Обратите внимание, что сообщения об исключениях немного отличаются:

FlurlHttpTimeoutException

Время ожидания вызова: POST https://...

FlurlHttpException

Звонок не удался. Тайм-аут соединения POST https://...

Кто-нибудь знает, как я могу исправить его, чтобы он вел себя так, как ожидается - выбрасывая FlurlHttpTimeoutException для всех значений времени ожидания?

1 Ответ

0 голосов
/ 29 апреля 2020

Я закончил тем, что сделал что-то вроде этого, что решило проблему, не уверен, что это правильный подход к go, но он добился цели.

/// <summary>
/// Gets a flurl client
/// </summary>
/// <returns></returns>
private IFlurlClient GetFlurlClient()
{
    return new FlurlClient(new HttpClient(new SocketsHttpHandler
    {
        PooledConnectionLifetime = TimeSpan.FromSeconds(ListenerTimeout + 10)
    })
    {
        BaseAddress = new Uri(ListenerUrl)
    })
        .Configure(s => s.Timeout = TimeSpan.FromSeconds(ListenerTimeout));
}
...