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

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

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

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

Мой код CCD приведен ниже:

        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 ине было хороших результатов за последнюю неделю.

Ответы [ 2 ]

4 голосов
/ 21 июля 2010

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

2 голосов
/ 21 июля 2010

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

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

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

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

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

...