rudolph098 Ответов: 1

Пересобранных асинхронных сделать запрос API не дожидаясь сведения.


Привет, ребята/девочки, у меня есть небольшая проблема. у меня есть метод, который выполняет запрос get. этот метод работает. поэтому я пересмотрел метод, чтобы некоторые части можно было использовать для других методов.

//Original Method
public async Task<T> GetByIdAsync(T returnType, T1 controllerName, T2 Id)
{
  var url = baseUrl + controllerName + "/" + Id;
  var result = returnType;
  using (HttpClient client = new HttpClient())
  {
     client.BaseAddress = new Uri(url);
     client.DefaultRequestHeaders.Accept.Clear();
     client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

      var response = await client.GetAsync(url);
      if (response.IsSuccessStatusCode)
      {
         var data = response.Content.ReadAsStringAsync();
          result = JsonConvert.DeserializeObject(data.Result);
       }
    }
}


//refactored method        
public async Task<T> GetByIdAsync<T, T1, T2>(T returnType, T1 controllerName, T2 Id)
{
    var url = baseUrl + controllerName + "/" + Id;
    var result = returnType;
    var client = GetClient(url);

    var response = await client.GetAsync(url);
    if (response.IsSuccessStatusCode)
    {
        var data = response.Content.ReadAsStringAsync();
        result = JsonConvert.DeserializeObject<T>(data.Result);
    }
    return result;
}

public static HttpClient GetClient(string url)
{
    using (HttpClient client = new HttpClient())
    {
        client.BaseAddress = new Uri(url);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

        return client;
    }
}


После того, как я пересмотрел метод, он больше не ждет. что случилось? ..

Что я уже пробовал:

исходный код работает, я пытаюсь понять, почему переработанный код не работает

1 Ответов

Рейтинг:
12

F-ES Sitecore

"using" утилизирует (уничтожает) объект, когда он покидает контекст using, поэтому ваш HttpClient не может использоваться вне метода GetClient. Удалите " использование"

public static HttpClient GetClient(string url)
{
    HttpClient client = new HttpClient();
    client.BaseAddress = new Uri(url);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
 
    return client;
}


rudolph098

Спасибо, теперь это работает. Но есть ли какие-либо возможные побочные эффекты, которые могут возникнуть при удалении оператора using в методе GetClient(url)?

F-ES Sitecore

Нет, это просто короткий способ написать это

HttpClient клиент;
пробовать
{
клиент = новый HttpClient();
клиент.Базовый адрес = новый URI(URL-адрес);
клиент.DefaultRequestHeaders.Принимать.Четкий();
клиент.DefaultRequestHeaders.Принять.Добавить(новую систему.Нет.Протоколу HTTP.Заголовки.MediaTypeWithQualityHeaderValue ("application/json"));

возврат клиента;
}
ловить
{
бросать;
}
наконец
{
клиент.Располагать();
}

Важный бит-это вызов Dispose в "finally", вот почему вы используете" using", и это именно та строка, которая вам не нужна.

rudolph098

Спасибо за объяснение

Richard Deeming

Смущает, хотя и реализует IDisposable, этот HttpClient почти никогда не следует заворачивать в using заявление:
Вы неправильно используете HttpClient, и это дестабилизирует ваше программное обеспечение : ASP.NET монстры[^]

rudolph098

Вау!!!!, спасибо за эту проницательную статью.