Подтвердить что ты не робот

Как загрузить большие (> 25 МБ) файлы в веб-службу?

У меня есть веб-служба, которая берет байт [] и сохраняет его.

Это отлично подходит для "маленьких" файлов, но как только я нахожу определенный размер, веб-служба терпит неудачу и возвращает "Ошибка запроса с HTTP-статусом 404: не найден".

Из того, что я видел, это параметр IIS, который ограничивает размер файла, который может быть отправлен (для предотвращения атак типа "отказ в обслуживании" ). Я попытался увеличить эту настройку, но у меня возникли проблемы с определением того, что настройка и где/как ее установить. Я использую IIS7, и веб-сервис выполняется в .net(asmx).

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

  <system.web>
     <httpRuntime executionTimeout="999999" maxRequestLength="2097151" />
     ...
  </system.web>

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

4b9b3361

Ответ 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>