. NET HttpClient sendAsyn c () Тайм-аут для второго запроса специально - PullRequest
0 голосов
/ 21 января 2020

Я работал над прокси-подобным контроллером на ASP. NET, он берет URL-адрес из входящего запроса и использует HttpClient для вызова URL-адреса, а затем возвращает файл.

Этот прокси-подобный Контроллер работает следующим образом:

  • Работает нормально при выполнении одного запроса
  • Работает нормально при выполнении нескольких запросов, эти ответы имеют тип содержимого "application / json" и "xml "
  • Тайм-аут запроса на 2-й запрос и задание отменено при выполнении 4 запросов, эти ответы имеют тип содержимого" image / png ". Например:

(Эти 4 запроса отправляются контроллеру почти одновременно).

  • Запрос 1 - начало в 0 с, завершается в 1 с
  • Запрос 2 - запуск в 1 с, тайм-аут и исключение в 11:00 (время ожидания 10 с), сервер зависает до истечения времени ожидания
  • Запрос 3 - начало в 11 с, завершается в 12 с
  • Запрос 4 - начало в 12 с, окончание в 13 с

Пожалуйста, игнорируйте ситуацию POST

Контроллер

public async Task<FileStreamResult> Proxy(string method, string url, string data = "")
{
    myHttpClient client = new myHttpClient();
    Tuple<MemoryStream,string> result = await client.Proxy(this.Request, method, url).ConfigureAwait(false);
    return File(result.Item1,result.Item2); //file stream and file type
}

HttpClient

public class myHttpClient
{
    private static HttpClient _httpClient;
    static myHttpClient()
    {
        if (_httpClient == null) {
            _httpClient = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true });
            _httpClient.Timeout = TimeSpan.FromSeconds(7);
            Log ocLog = new Log();
            ocLog.Write("init client " + ServicePointManager.DefaultConnectionLimit ,false);
        }
    }
    public async Task<Tuple<MemoryStream, string>> Proxy(HttpRequestBase contextRequest, string method, string url)
    {
        var request = new HttpRequestMessage();
        request.RequestUri = new Uri("http://localhost" + url);
        if (method == "GET")
        {
            request.Method = HttpMethod.Get;
            request.Content = null;
        }
        else if (method == "POST")
        {
            request.Method = HttpMethod.Post;
        }

        //copy request header from context.Request
        foreach (string headerName in contextRequest.Headers)
        {
            string[] headerValues = contextRequest.Headers.GetValues(headerName);
            if (!request.Headers.TryAddWithoutValidation(headerName, headerValues))
            {
                request.Content.Headers.TryAddWithoutValidation(headerName, headerValues);
            }
        }

        try
        {
            using (HttpResponseMessage response = await _httpClient.SendAsync(request).ConfigureAwait(false))
            {
                if (response.IsSuccessStatusCode)
                {
                    var contentBytes = await response.Content.ReadAsByteArrayAsync().ConfigureAwait(false);
                    MemoryStream ms = new MemoryStream(contentBytes);
                    return new Tuple<MemoryStream, string>(ms, response.Content.Headers.ContentType.ToString());
                }
                else
                {
                    return null;
                }

            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}

Что я пробовал

  1. Проверка ServicePointManager .DefaultConnectionLimit. Он очень большой.
  2. Использовать System. net .WebRequest библиотека вместо HttpClient, все тот же.

1 Ответ

0 голосов
/ 24 января 2020

Проблема была решена путем установки «Максимальное количество рабочих процессов» пула приложений на 3. Это добилось цели

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...