Как загрузить большие (> 25 МБ) файлы в веб-службу?
У меня есть веб-служба, которая берет байт [] и сохраняет его.
Это отлично подходит для "маленьких" файлов, но как только я нахожу определенный размер, веб-служба терпит неудачу и возвращает "Ошибка запроса с HTTP-статусом 404: не найден".
Из того, что я видел, это параметр IIS, который ограничивает размер файла, который может быть отправлен (для предотвращения атак типа "отказ в обслуживании" ). Я попытался увеличить эту настройку, но у меня возникли проблемы с определением того, что настройка и где/как ее установить. Я использую IIS7, и веб-сервис выполняется в .net(asmx).
В web.config веб-службы я добавил следующее (что, казалось, увеличило размер файла, который можно принять, но не весь путь к этому размеру настроек)
<system.web>
<httpRuntime executionTimeout="999999" maxRequestLength="2097151" />
...
</system.web>
Любые предложения о том, где (и как) увеличить размер файла, который будет очень цениться веб-службой.
Ответы
Ответ 1
В дополнение к адресу httpRuntime/maxRequestLength, упомянутому в вопросе, похоже, что есть дополнительный элемент, который можно добавить в файл web.config веб-службы, чтобы разрешить большие передачи файлов.
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="2000000000" />
</requestFiltering>
</security>
</system.webServer>
Это означает, что вы можете загружать более крупные файлы через веб-службы.
Ответ 2
Вы должны иметь в виду, что веб-службы не предназначены в первую очередь как механизмы передачи файлов. Любой целевой протокол передачи файлов, скорее всего, будет работать лучше, чем веб-служба. Например, такие протоколы чаще справляются с восстановлением ошибок, частичной загрузкой и т.д.
Однако, если вы собираетесь использовать веб-службы для этой цели в .NET, вы должны использовать WCF, если это вообще возможно. Среди других преимуществ WCF обрабатывает потоковое вещание и, следовательно, будет намного более эффективным с точки зрения использования памяти. Я обеспокоен тем, что если вы будете следовать приведенным выше (точным) предложениям, ваш следующий результат будет исключен из-за нехватки памяти или ресурсов, поскольку старая технология ASMX пытается сразу загрузить весь ваш 25-мегабайтный файл в память. Фактически, он может иметь несколько копий в памяти одновременно!
Ответ 3
Если я застрял в использовании веб-сервисов и должен был поддерживать очень большие файлы, я бы посмотрел на реализацию системы, которая позволяет загружать файлы в куски.
Eg.
- ticketId GetTicket (размер)
- UploadData (ticketId, byte [] полезная нагрузка) (это можно назвать столько раз, сколько вы хотите)
- FinalizeUpload (ticketId)
Это позволит вам размещать большие загрузки и не хранить слишком много данных в памяти. Недостатком является то, что вы все еще используете довольно неэффективный механизм транспорта.
Ответ 4
Просто чтобы добавить информацию к людям, отправляющим по ссылке в этом web.config:
C:\Program Files\Common Files\Microsoft Shared\Расширения веб-сервера\12\ISAPI
<location path="Copy.asmx"> <!-- Name of you asmx -->
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="104857600"/> <!-- 100 megs -->
</requestFiltering>
</security>
</system.webServer>
</location>
Это решило нашу проблему после устранения этой проблемы в течение некоторого времени.
Ответ 5
Если вы настроились на использование веб-служб для перемещения файлов, я бы, по крайней мере, рассмотрел возможность использования вложений WS-Attachment/DIME. Основная проблема с отправкой байта [] над веб-службами заключается в том, что они помещаются в тело SOAP, которое получает кодировку в виде базовой строки 64. Кодирование файлов, таких как , увеличивает размер файла на целых две трети в теле мыла (т.е. Файл размером 6 МБ становится файлом 9 МБ по проводу).
Вероятно, ваша загрузка в 25 МБ превращается в ОГРОМНЫЕ конверты мыла.
Я бы настоятельно предложил прочитать это. Который может привести вас в DIME.
Здесь выдержка.
Microsoft WSE Toolkit позволяет вложения, которые необходимо отправить вместе с Метод веб-сервиса с использованием DIME и Стандарты WS-Attachments. Что ж изучить эти стандарты и более эффективны, чем отправка больших количества двоичных данных в сети вызов службы через другие общие означает.
Надеюсь, что это поможет!
Ответ 6
maxRequestLength находится в КБ, а не в байтах. Это должно дать вам ограничение 30 МБ в течение 4-минутного тайм-аута.
<httpRuntime executionTimeout="240" maxRequestLength="30000" />
Наличие слишком высоких чисел может фактически помешать вашим значениям применяться. Я думаю, что я столкнулся с этим несколько лет назад, когда думал, что это байтовый предел (неопределенная память).
Ответ 7
Это не отвечает конкретно на ваш вопрос, но то, что я делал в прошлом, это использование WCF для передачи имен/путей/списков файлов, но затем используйте FTP-библиотеку для передачи файла по FTP.
Ответ 8
это сработало для меня:
<binding name="uploadFilesBasicHttpBinding" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" receiveTimeout="00:10:10" sendTimeout="00:10:00" openTimeout="00:10:00" closeTimeout="00:10:00">
<readerQuotas maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxDepth="2147483647" maxNameTableCharCount="2147483647" maxStringContentLength="2147483647"/>
<security mode="TransportWithMessageCredential">
<message clientCredentialType="UserName"/>
</security>
</binding>