Как обрабатывать загрузки больших файлов через WCF?
Я изучаю использование WCF для проекта, который потребует от людей возможности загружать большие файлы (64 МБ-1 ГБ) на мой сервер. Как бы я справился с этим с WCF, возможно, с возможностью возобновления загрузки.
Чтобы справиться с большей клиентской базой, я хотел протестировать JSON через WCF. Как это повлияет на загрузку файла? Это может быть сделано из JSON, или им нужно будет переключиться на REST для загрузки части?
3 ответа
Если вы хотите загружать большие файлы, вам обязательно нужно заглянуть в потоковый режим 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);
}
Это должно сделать это!
Вы можете использовать webHttpBinding с потоковой передачей TransferMode и одним параметром Stream или ответом Stream (в зависимости от случая) для загрузки / загрузки больших файлов, но вам придется отправлять любые метаданные запроса через URL-адреса и / или заголовки, если вы не собираетесь разрабатывать ваше собственное обрамление в потоке. Вам придется создать собственный не HTML-клиент (например, Silverlight, Flash и т. Д.), Поскольку браузеры не поддерживают произвольный доступ к локальным файлам, и обычная загрузка файлов будет отправкой в форме, а не JSON.