Как обрабатывать загрузки больших файлов через WCF? - PullRequest
16 голосов
/ 20 декабря 2009

Я изучаю использование WCF для проекта, который потребовал бы от людей возможности загружать большие файлы (64 МБ-1 ГБ) на мой сервер. Как бы я справился с этим с WCF, возможно, с возможностью возобновления загрузки.

Чтобы справиться с большей клиентской базой, я хотел протестировать JSON через WCF. Как это повлияет на загрузку файла? Это может быть сделано из JSON, или им нужно будет переключиться на REST для загрузки части?

Ответы [ 3 ]

19 голосов
/ 20 декабря 2009

Если вы хотите загружать большие файлы, вам обязательно нужно заглянуть в Режим потоковой передачи WCF .

Как правило, вы можете изменить режим переноса на вашей привязке; по умолчанию оно буферизуется, т. е. все сообщение должно буферизироваться в отправителе, сериализироваться, а затем передаваться целиком.

С помощью Streaming вы можете определить либо одностороннюю потоковую передачу (только для загрузки, только для загрузки), либо двустороннюю потоковую передачу. Это делается путем установки TransferMode вашей привязки в StreamedRequest, StreamedResponse или просто в Streamed.

<bindings>
   <basicHttpBinding>
      <binding name="HttpStreaming" 
               maxReceivedMessageSize="2000000"
               transferMode="StreamedRequest"/>
   </basicHttpBinding>
</bindings>

Тогда вам нужно иметь контракт на обслуживание, который либо получает параметр типа Stream (для загрузки), либо возвращает значение типа Stream (для загрузки).

[ServiceContract]
public interface IFileUpload
{
    [OperationContract]
    bool UploadFile(Stream stream);
}

Это должно сделать это!

1 голос
/ 20 декабря 2009

MTOM оптимизирован для обработки больших двоичных данных.

0 голосов
/ 20 декабря 2009

Вы можете использовать webHttpBinding с потоковой передачей TransferMode и одним параметром Stream или ответом Stream (в зависимости от ситуации) для загрузки / скачивания больших файлов, но вам придется отправлять любые метаданные запроса через URL-адреса и / или заголовки, если вы не Собираюсь разработать собственное обрамление в потоке. Однако вам придется создать собственный не HTML-клиент (например, Silverlight, Flash и т. Д.), Поскольку браузеры не поддерживают произвольный доступ к локальным файлам, и обычная загрузка файлов будет отправкой в ​​форме, а не JSON.

...