Потоки имеют указатель, указывающий, в каком положении находится поток; после копирования указатель находится в конце. Вам нужно перемотать поток, установив его положение на 0.
Однако это поддерживается только в потоках, которые поддерживают поиск. Вы можете прочитать поток запроса только один раз . Это связано с тем, что он читается «с провода» и поэтому не поддерживает поиск.
Когда вы хотите скопировать поток запроса в несколько потоков вывода, у вас есть два варианта:
- Вперед, пока вы читаете
- Прочитайте один раз в память, а затем переведите по желанию
Первый вариант означает, что все пересылки происходят с одинаковой скоростью; вся передача идет так же медленно, как ввод, или так медленно, как самый медленный читатель. Вы читаете чанк от вызывающего и перенаправляете этот чанк на все адреса переадресации.
При втором подходе вы захотите оценить, можете ли вы хранить все тело запроса плюс тело для каждого адреса переадресации в Память. Если это не является проблемой и правильно настроено с разумными ограничениями, просто скопируйте поток запроса в один MemoryStream и скопируйте и перемотайте его после каждого вызова:
using (var bodyStream = new MemoryStream())
{
await Request.Body.CopyToAsync(bodyStream);
for (...)
{
using (var stream = new MemoryStream())
{
await bodyStream.CopyToAsync(stream);
// Rewind for next copy
bodyStream.Position = 0;
}
}
}