Похоже, вы передаете большой файл от клиента, ловите его в одной веб-службе WCF, затем перезаписываете данные в новый HttpWebRequest, а затем отправляете его на другой хост. Я думаю, у меня возникнет соблазн попробовать буферизовать данные от клиента к вашей веб-службе, а не передавать их в потоковом режиме.
Я провел последний год, работая над проектом, похожим на то, чем вы занимаетесь. Разница между потоковой передачей и буферизацией заключается в следующем:
Потоковая передача считывает (из источника), а затем записывает (в целевой объект) данные в интерактивном процессе, над которым у вас нет большого контроля. Если исходный файл большой (например, гигабайт или больше), запрос/ответ WCF будет повторяться дюжину или более раз между клиентом и хостом, прежде чем запрос будет завершен.
Буферизация, с другой стороны, накапливает все содержимое целевого файла ДО заполнения запроса и его отправки на хост, тем самым ускоряя процесс. А поскольку снижение производительности, связанное с буферизацией (время, необходимое для накопления байтов в памяти), ложится на клиента, обычно это не проблема.
Таким образом, при буферизации данных от клиента ваш хост вы получите один Http-запрос с полным массивом байтов (скажем), который готов к переупаковке в запрос, который вы передаете на второй, целевой хост WCF. В этот момент, опять же, у вас есть выбор между буферизацией и потоковой передачей. На хосте, если производительность имеет значение, потоковая передача запроса на второй хост улучшит вашу масштабируемость, но (опять же) может снизить вашу производительность.
На стороне клиента:
With binding
.TransferMode =TransferMode.Buffered 'instead of Transfermode.Streamed
.MessageEncoding = WSMessageEncoding.Text
.TextEncoding = System.Text.Encoding.UTF8
.MaxReceivedMessageSize = Integer.MaxValue
.ReaderQuotas.MaxArrayLength = Integer.MaxValue
.ReaderQuotas.MaxBytesPerRead = Integer.MaxValue
.ReaderQuotas.MaxDepth = Integer.MaxValue
.ReaderQuotas.MaxNameTableCharCount = Integer.MaxValue
.ReaderQuotas.MaxStringContentLength = Integer.MaxValue
.MaxBufferSize = Integer.MaxValue
.MaxBufferPoolSize = Integer.MaxValue
На принимающей стороне:
With binding
.TransferMode = TransferMode.Buffered
.MaxReceivedMessageSize = Integer.MaxValue
person
Brian
schedule
19.04.2013