.Net Core 2.2, PutAsync, HttpContent Вопрос - PullRequest
0 голосов
/ 28 мая 2019

Я перехожу с узла с экспрессом на .Net Core 2.2. Я пытаюсь создать запрос на добавление обновлений API. Я понял, что могу создать его с помощью

var client = new HttpClient(); client.PutAsync(url, httpContent)

Мой первый вопрос: как мне создать httpContent? Обычно в этой ситуации я создаю объект JSON, но, конечно, это не сработает.

Мой второй вопрос: я использую .Net Core 2.2. Является ли использование HttpClient правильным способом или я должен использовать Factory?

1 Ответ

0 голосов
/ 28 мая 2019

Пожалуйста, обратитесь к следующему фрагменту кода, чтобы сделать запрос на публикацию, вы можете выполнить запрос на то же самое, просто измените метод на Put.

protected async Task<Tuple<HttpStatusCode, TOutput>> MakeRequest<TInput, TOutput>(string baseAdrress, string apiUrl, TInput data)
{
    var contentData = new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json");

    var client = new HttpClient();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    client.BaseAddress = new Uri(baseAdrress);

    var response = await client.SendAsync(new HttpRequestMessage
    {
        RequestUri = new Uri(apiUrl, UriKind.Relative),
        Content = contentData,
        Method = HttpMethod.Post
    });

    if (response.StatusCode == HttpStatusCode.InternalServerError)
    {
        return Tuple.Create(HttpStatusCode.InternalServerError, default(TOutput));
    }

    var stringData = await response.Content.ReadAsStringAsync();
    var jsonData = JsonConvert.DeserializeObject<TOutput>(stringData);

    return Tuple.Create(HttpStatusCode.OK, jsonData);
}

Приведенный выше код является просто быстрой демонстрацией использования http-клиента, в реальной жизни вы должны использовать вместо него HttpClientFactory. Есть несколько способов использования HttpClientFactory, которые вы можете прочитать здесь в Microsoft Docs

Использование HttpClient напрямую может привести к некоторым проблемам, о которых упомянул M $ «В качестве первой проблемы, хотя этот класс является одноразовым, использование его с оператором using не лучший выбор, поскольку даже при удалении объекта HttpClient, лежащего в основе Сокет не освобождается сразу и может вызвать серьезную проблему с именем «исчерпание сокетов». "

...