F # HttpClient проблемы тайм-аута - PullRequest
4 голосов
/ 05 ноября 2019

Я использовал два способа создания HttpClient, оба написанные немного по-разному, но оба приводят к отправке http-запроса. Но я сталкиваюсь с некоторым странным поведением при работе с первым методом.

1

let HttpPost clientTimeoutInMilliseconds (content:StringContent, serviceEndpoint:string) =
    let httpClient = new HttpClient()
    httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"))
    httpClient.Timeout <- new TimeSpan(0, 0, 0, 0, clientTimeoutInMilliseconds)
    httpClient.PostAsync(serviceEndpoint, content).Result

Эта функция приводит к тому, что происходит много тайм-аутов, очень медленное время отклика (обычно 3, 4, 5,... секунд) и интенсивное использование потоков, прежде чем в конечном итоге привести к исчерпанию потоков и остановке приложения. Из наших журналов видно, что изначально использование потоков является нормальным, но через короткий промежуток времени каждое сообщение, которое обрабатывает приложение, присваивается новому потоку. Это произойдет как при легких, так и при тяжелых рабочих нагрузках.

Исключение

Exception

2

let HttpClientCreate timeoutInMilliseconds () =
    let httpClient = new HttpClient()
    httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"))
    httpClient.Timeout <- new TimeSpan(0, 0, 0, 0, timeoutInMilliseconds)
    httpClient

let HttpPost clientTimeoutInMilliseconds (content:StringContent, serviceEndpoint:string) =
    let httpClientCreate' = clientTimeoutInMilliseconds |> HttpClientCreate
    httpClientCreate'().PostAsync(serviceEndpoint, content).Result

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

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

clientTimeoutInMilliseconds имеет значение 10000

Работа в ядре .net версии 2.2.101

Версия Linux - 18.04.3

...