Загрузка очень больших файлов (8 ГБ +) - объединение WCF и WebClient? - PullRequest
4 голосов
/ 12 марта 2012

У меня возникли некоторые проблемы при создании службы WCF, которая поддерживает загрузку очень больших файлов.Я прочитал много руководств о том, как установить атрибут TransferMode для Streamed, увеличить все атрибуты messageSize и bufferSize до Int32.MaxValue, и все же мне не повезло.(Я также возвращаю поток в качестве тела сообщения через атрибут MessageBodyMember, а метаданные отправляются через заголовки с использованием атрибутов MessageHeader).

Если я задаю все эти атрибуты, я могу нормально загрузить файлы меньшего размера, нокогда я пытаюсь загрузить файлы размером 1-2 ГБ, я просто получаю ошибку 400 неверных запросов, что затрудняет отладку ...

В идеале мой сервис должен поддерживать файлы размером не менее 8 ГБ.Это даже выполнимо с WCF?Различные атрибуты messageSize файла web.config, по-видимому, ограничены Int32.MaxValue, который равен максимальному размеру файла 2 ГБ.

Из моих исследований я обнаружил, что, похоже, мне придется использовать WebClient.DownloadFileвместо.Файлы должны быть доступны для скачивания только пользователям, имеющим необходимые права.В WCF мой метод загрузки мог принимать параметр токена, который сервер мог проверять и возвращать поток, только если у пользователя были права на загрузку запрошенного файла.Это не кажется прямым, используя подход WebClient.Если у кого-то есть какие-то рекомендации относительно того, как это сделать (через WebClient), я был бы очень признателен.

В идеале моя служба WCF должна администрировать и предоставлять пользовательские токены и каким-то образом привязывать к каждому отдельному файлу, какие токены в настоящее время используются.законно (токены должны быть использованы только один раз).Затем загрузка должна осуществляться через WebClient.

Заранее благодарим за любые подсказки.

1 Ответ

2 голосов
/ 12 марта 2012

Вы можете сделать это в WCF.Много месяцев назад я создал сервис, который делал это (у нас не было веб-сервера как части нашей конфигурации).Мы использовали потоковую передачу WCF:

http://msdn.microsoft.com/en-us/library/ms733742.aspx

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

...