Отправка потоков и массива байтов

Последнее обновление: 22.10.2022

Отправка потоков. StreamContent

Для отправки потоков с помощью HttpClient применяется класс StreamContent. Его конструктор в качестве обязательного параметра принимает объект Stream, то есть поток, данные которого отправляются на сервер. Рассмотрим на примере отправки в потоке данных какого-нибудь файла .

Для тестирования определим следующее веб-приложение ASP.NET Core:

var builder = WebApplication.CreateBuilder();
var app = builder.Build();

app.MapPost("/data", async(HttpContext httpContext) =>
{
    // путь к папке, где будут храниться файлы
    var uploadPath = $"{Directory.GetCurrentDirectory()}/uploads";
    // создаем папку для хранения файлов
    Directory.CreateDirectory(uploadPath);
    // генерируем произвольное название файла с помощью guid
    string fileName = Guid.NewGuid().ToString();
    // получаем поток
    using (var fileStream = new FileStream($"{uploadPath}/{fileName}.jpg", FileMode.Create))
    {
        await httpContext.Request.Body.CopyToAsync(fileStream);
    }

    await httpContext.Response.WriteAsync("Данные сохранены");
});

app.Run();

Здесь с помощью метода app.MapPost() определена одна конечная точка, которая обрабатывает POST-запросы по адресу "/data"/. В обработчике конечной точки создаем каталог для загружаемых файлов - он будет называться "uploads" и будет располагаться в папке проекта. И также генерируем произвольное имя файла с помощью Guid.NewGuid().

Все отправленные в запросе данные доступны через свойство httpContext.Request.Body - оно представляет объект Stream, то есть по сути поток, который будет отправляться на клиенте с помощью StreamContent. И чтобы сохранить из этого потока данные в файл, определяем объект FileStream и с помощью метода CopyToAsync() копируем данные из httpContext.Request.Body в FileStream (по сути в файл)

await httpContext.Request.Body.CopyToAsync(fileStream);

Здесь для теста просто предполагаем, что файл будет иметь расширение "jpg"

В конце посылаем в ответ клиенту некоторое диагностического сообщение.

В качестве клиента будет выступать следующее консольное приложение:

class Program
{
    static HttpClient httpClient = new HttpClient();
    static async Task Main()
    {
        // отправляемые данные
        string filePath = "D:\\forest.jpg";
        using var fileStream = File.OpenRead(filePath);
        // создаем объект HttpContent
        StreamContent content = new StreamContent(fileStream);
        // отправляем запрос
        using var response = await httpClient.PostAsync("https://localhost:7094/data", content);
        // получаем ответ
        string responseText = await response.Content.ReadAsStringAsync();
        Console.WriteLine(responseText);
    }
}

В качестве теста здесь отправляется данные из файла "D:\\forest.jpg". Для отправки сначала создается поток FileStream, который представляет этот файл:

using var fileStream = File.OpenRead(filePath);

Далее этого поток передается в StreamContent:

StreamContent content = new StreamContent(fileStream);

Затем StreamContent отправляется на сервер в методе httpClient.PostAsync() (в моем случае веб-приложение ASP.NET запущено по адресу "https://localhost:7094/").

В результате выполнения программы в проекте веб-приложения ASP.NET появится папка "uploads", а в нее будет сохранен файл:

StreamContent и отправка потока с помощью HttpClient в C# и .NET

Отправка массива байтов. ByteArrayContent

Для отправки массива байтов применяется класс ByteArrayContent, конструктор которого в качестве обязательного параметра принимает массив байтов. Например, для простенького примера конвретируем строку в массив байтов и отправим на сервер:

class Program
{
    static HttpClient httpClient = new HttpClient();
    static async Task Main()
    {
        // отправляемые данные
        string message = "Hello METANIT.COM";
        // считываем строку в массив байтов 
        byte[] messageToBytes = System.Text.Encoding.UTF8.GetBytes(message);
        // формируем отправляемое содержимое
        var content = new ByteArrayContent(messageToBytes); 
        // отправляем запрос
        using var response = await httpClient.PostAsync("https://localhost:7094/data", content);
        // получаем ответ
        string responseText = await response.Content.ReadAsStringAsync();
        Console.WriteLine(responseText);
        
    }
}

Здесь строку конвертируем в массив байтов с помощью метода System.Text.Encoding.UTF8.GetBytes(). Для тестирования отправки м можно определить следующее веб-приложение ASP.NET Core:

var builder = WebApplication.CreateBuilder();
var app = builder.Build();

app.MapPost("/data", async(HttpContext httpContext) =>
{
    // считываем полученные данные в строку
    using StreamReader streamReader = new StreamReader(httpContext.Request.Body);
    string message = await streamReader.ReadToEndAsync();  
    await httpContext.Response.WriteAsync($"Отправлено сообщение: {message}");
});

app.Run();
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850