Я перехожу с узла с экспрессом на .Net Core 2.2. Я пытаюсь создать запрос на размещение для отправки обновлений в API. Я понял, что могу создать его с помощью
var client = new HttpClient();
client.PutAsync(url, httpContent)
Мой первый вопрос: как мне создать httpContent? Обычно в этой ситуации я бы создал объект JSON, но, конечно, здесь это не сработает.
Мой второй вопрос: я использую .Net Core 2.2. Правильно ли использовать HttpClient или мне следует использовать Factory?
Пожалуйста, обратитесь к следующему фрагменту кода, чтобы сделать почтовый запрос, вы можете выполнить запрос на размещение в то же время, просто измените метод на Поместить.
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$. «Во-первых, хотя этот класс является одноразовым, использование его с оператором использования — не лучший выбор, потому что даже когда вы удаляете объект HttpClient, базовый сокет не немедленно выпущен и может вызвать серьезную проблему, называемую «исчерпанием сокетов».
Вы можете использовать следующий фрагмент кода, чтобы сделать запрос на размещение.
protected async Task<Tuple<Boolean, TOutput>> PutResult<TInput, TOutput>(String url, TOutput fallbackValue, TInput input)
{
HttpRequestMessage requestMessage = GetPutHttpRequestMessageWithSerializedContent(url, input);
Tuple<Boolean, TOutput> result = await SendAsync(requestMessage, fallbackValue);
return result;
}
private HttpRequestMessage GetPutHttpRequestMessageWithSerializedContent<TInput>(String url, TInput input)
{
String rawContent = JsonConvert.SerializeObject(input, JsonSerializerOptions);
StringContent content = new StringContent(rawContent, Encoding.UTF8, "application/json");
HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Put, url)
{
Content = content
};
return requestMessage;
}