Как передать большой Zip-файл (50 МБ) с помощью службы WCF через SOAP любому клиенту?

У меня есть служба WCF, которая возвращает массив байтов с файлом Zip (50 МБ) любому клиенту, который его запрашивает. Если Zip очень маленький (скажем, 1 МБ), ответ SOAP исходит от WCF со встроенным в него массивом байтов. Но размер ответа очень велик даже для файла размером 1 МБ. Если я пытаюсь передать файл размером 50 МБ, служба зависает и выдает исключение нехватки памяти, потому что размер ответа SOAP становится огромным.

  1. Каков наилучший вариант, доступный с WCF / веб-службой для передачи больших файлов (в основном в формате ZIP), поскольку я отправляю обратно массив байтов. Есть ли какой-нибудь хороший подход вместо этого для отправки файла обратно?

  2. Является ли WCF / веб-сервис лучшим способом передачи больших файлов любому клиенту или есть какой-либо другой лучший вариант / доступная технология, обеспечивающая совместимость и масштабируемость для 10 000 пользователей?

Мой код Ccode ниже:

        String pathfordownload = @"D:\New Folder.zip";
        FileStream F2D = new FileStream(pathfordownload, FileMode.Open,FileAccess.Read);
        BinaryReader binReader = new BinaryReader(F2D);
        binReader.BaseStream.Position = 0;
        byte[] binFile = binReader.ReadBytes(Convert.ToInt32 (binReader.BaseStream.Length));
        binReader.Close();
        return binFile;

Рабочий кусок / реальная информация будет действительно полезен, поскольку я борюсь со всеми данными, доступными в Google, и не получил хороших результатов за последнюю неделю.


person Defendore    schedule 21.07.2010    source источник


Ответы (2)


Вы можете передать поток через WCF, а затем отправить (почти ) файлы неограниченной длины.

person Henk Holterman    schedule 21.07.2010

Я столкнулся с той же проблемой. Нехватка памяти неизбежна, потому что вы используете байтовые массивы.

Что мы сделали, так это очистили данные на жестком диске, поэтому вместо того, чтобы быть ограниченным вашей виртуальной памятью, ваша емкость для одновременных транзакций - это пространство HD.

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

Таким образом, вместо того, чтобы отвечать файлом, ваша служба могла бы ответить URL-адресом http с указанием местоположения файла. Затем, когда клиент успешно загрузил с сервера стандартный HttpRequest или WebClient, он вызывает метод для удаления файла. В SOAP это может быть Delete (строковый URL-адрес), в REST - это метод удаления для ресурса.

Надеюсь, это имеет для вас смысл. Самая важная часть этого - понять, что в масштабируемом программном обеспечении, особенно если вы смотрите на 10000 клиентов (одновременно?), Вы не можете использовать ограниченные ресурсы, такие как потоки памяти или байтовые массивы. Но лучше полагаться на большие и легко расширяемые ресурсы, такие как раздел жесткого диска, который в конечном итоге может оказаться в SAN, и ИТ-специалисты могут наращивать раздел по мере необходимости.

person Four    schedule 21.07.2010