Как обрабатывать большие загрузки файлов через WCF?

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

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

Ответы

Ответ 1

Если вы хотите загружать большие файлы, вам обязательно нужно будет изучить Режим потоковой передачи 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);
}

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

Ответ 2

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

Ответ 3

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