Если вы уже знаете, что запрашиваемый файл может быть довольно большим, то вы можете создать собственную конкретную конечную точку для этого запроса, которая поддерживает потоковую передачу.
Таким образом, у вас будет обычная конечная точка (например, http://yourserver:8080/YourService), которую вы используете для «обычных» вызовов методов), и вторая конечная точка (http://yourserver:8085/YourService), которая будет поддерживать потоковую передачу для отправки файла с разумные объемы памяти.
Настройка этого должна быть довольно простой - и на сервере, и на клиенте вам необходимо указать конфигурацию привязки для поддержки потоковой передачи:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="streamed"
transferMode="StreamedResponse" />
</basicHttpBinding>
</bindings>
<services>
<service name="YourService">
<endpoint name="normal"
address="http://yourserver:8080/YourService"
binding="basicHttpBinding"
contract="IYourServiceContract" />
<endpoint name="filetransfer"
address="http://yourserver:8085/YourService"
binding="basicHttpBinding"
bindingConfiguration="streamed"
contract="IYourServiceContract" />
</service>
</services>
</system.serviceModel>
На клиенте, конечно, вы должны иметь две конечные точки внутри тега <client>
, но в остальном все должно быть одинаково.
«TransferMode» по умолчанию «буферизован», например, все сообщение буферизуется и отправляется в одном блоке.
Другими вариантами являются «Потоковый» (потоковая передача в обе стороны), «StreamedRequest» (если у вас действительно большие запросы) или «StreamedResponse» (если только ответ, передаваемый файл действительно большой).
В этом случае в вашей службе будет один метод, который будет возвращать stream (т.е. файл). От вашего клиента, когда вы вызываете этот сервисный метод, вы получаете поток, который затем можете читать в блоках, как MemoryStream или FileStream.
Марк