SafeHttpClient — безопасная обёртка над HttpClient, предназначенная для выполнения HTTP-запросов из динамического кода.
Класс используется в обработчиках платформы, например:
Он предоставляет защищённый механизм для интеграции с внешними системами. Клиент ограничивает небезопасные сетевые операции и предотвращает доступ к внутренним ресурсам инфраструктуры.
Экземпляр клиента можно получить через контекст:
var http = context.GetHttpClient();
SafeHttpClient применяет ряд ограничений для предотвращения небезопасных сетевых запросов.
Поддерживаются только схемы:
http;https.Использование других схем URL запрещено.
Для каждого URL действует ограничение частоты запросов. Параметры ограничения:
Если лимит превышен, будет выброшено исключение:
Rate limit exceeded
Основные методы клиента:
public class SafeHttpClient : IDisposable
{
Task<string> GetStringAsync(string url);
Task<HttpResponseMessage> SendAsync(HttpRequestMessage request);
}
Task<string> GetStringAsync(string url)
Отправляет HTTP GET-запрос и возвращает тело ответа в виде строки.
Перед выполнением запроса клиент проверяет:
Если сервер возвращает код ошибки, будет выброшено исключение.
Task<HttpResponseMessage> SendAsync(HttpRequestMessage request)
Отправляет произвольный HTTP-запрос. Метод поддерживает:
Перед отправкой запроса выполняются те же проверки безопасности, что и в GetStringAsync.
Если ответ сервера содержит код ошибки, метод вызывает EnsureSuccessStatusCode() и генерирует исключение.
var http = context.GetHttpClient();
var response = await http.GetStringAsync(
"https://api.example.com/projects"
);
await context.Log("Получен ответ от API");
var http = context.GetHttpClient();
var request = new HttpRequestMessage(
HttpMethod.Post,
"https://api.example.com/projects"
);
request.Content = JsonContent.Create(new
{
name = "Test project"
});
var response = await http.SendAsync(request);
SafeHttpClient реализует IDisposable. Однако при использовании клиента через context.GetHttpClient() освобождение ресурсов выполняется автоматически платформой.
SafeHttpClient вместо обычного HttpClient в динамическом коде.Перейти на русскую версию?