2011-01-04 9 views
3

У меня есть клиентское приложение, которое разговаривает с службой обновления для загрузки файлов. Служба обновления получает их из базы данных, а затем отправляет их клиенту с использованием WCF. На данный момент я использую WSHttpBinding, чтобы воспользоваться преимуществами безопасности. Таким образом, самый большой файл, который я загружал/отправлял, составляет около 8 МБ, и это отлично работает. Недавно я попробовал его с файлом размером около 130 МБ, но ничего не произошло на клиенте; использование сети просто сидело на 0%.Сколько байтов передано в WCF до того, как я буду использовать потоковое вещание?

Я предполагаю, что файл слишком велик для передачи без потоковой передачи (maxReceivedMessageSize и т. Д., Равно 209715200, поэтому я знаю, что настройки подходят для него). Чтобы исправить это, я хочу, чтобы служба использовала BasicHttpBinding, чтобы я мог передавать файл, если он больше определенного размера.

Мой вопрос: в каком файле размера я должен переключиться с WSHttpBinding на BasicHttpBinding и потоковое? Есть ли какой-то стандарт, за которым следует следовать? Или моя логика здесь совершенно не так?

ответ

2

Нет никакого твердого правила или формулы для вычисления этого - как обычно, зависит от ваших обстоятельств..

Рассмотрим это:

  • ваша служба обычно может обслуживать несколько абонентов одновременно (в зависимости от настроек дроссельных) - предположим, 10 или 20 одновременных абонентов на текущий

  • , если каждый из этих звонящих хочет загрузите файл, весь файл необходимо буферизовать в вашей памяти службы WCF, если вы не используете потоковое вещание.

So если 20 абонентов попытаются загрузить файл по 100 МБ каждый в одно и то же время, ваш сервер на стороне сервера должен будет иметь возможность одновременно использовать 2 ГБ ОЗУ. Может ли ваш сервер обрабатывать это, помимо всех других обычных процессов?

С помощью этого простого расчета вы, вероятно, можете сделать разумную оценку того, что ограничение размера в вашем случае имеет смысл переключиться на потоковое вещание.

+1

Хорошо, но поскольку служба получает файл из моей базы данных SQL для каждого вызывающего абонента, даже при потоковой передаче ему не нужен полный 100 МБ-файл в памяти для каждого вызывающего абонента (20 абонентов = еще 2 ГБ ОЗУ)? Есть ли способ, которым я могу просто использовать службу WCF в качестве «моста» из базы данных для клиента, не требуя для этого полного файла в памяти? Или я могу как-то получить только одну копию в памяти и сохранить ее там, пока все вызывающие абоненты не получат ее? – Marcus

1

Как отмечает marc_s, это зависит от активности вашего сайта и доступной памяти.

Как правило, я обычно начинаю рассматривать потоковое вещание, когда средний размер начинает приближаться к 1 Мб. 5Mb - мой предел «должен поток».