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

Если вы внесли какие-либо изменения в пакеты - снова запустите sln. Это сработало для меня!

29
задан ChrisHDog 15 June 2009 в 23:18
поделиться

8 ответов

В дополнение к httpRuntime / maxRequestLength, упомянутому в вопросе, похоже, есть дополнительный элемент, который можно добавить в файл web.config веб-службы, чтобы разрешить передачу больших файлов.

  <system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="2000000000" />
      </requestFiltering>
    </security>
  </system.webServer>

Похоже, это позволяет загружать файлы большего размера через веб-службы.

31
ответ дан 28 November 2019 в 01:34
поделиться

maxRequestLength указывается в килобайтах, а не в байтах. Это должно дать вам ограничение в 30 МБ в течение 4-минутного периода ожидания.

<httpRuntime executionTimeout="240" maxRequestLength="30000" />

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

1
ответ дан richardtallent 14 October 2019 в 08:12
поделиться

Просто для того, чтобы добавить информацию людям, прибегающим к помощи этой 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>

This решил проблему после устранения этой проблемы за довольно сомнительное время.

5
ответ дан sonstabo 14 October 2019 в 08:12
поделиться

это сработало для меня:

            <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>
0
ответ дан Dragos Durlut 14 October 2019 в 08:12
поделиться

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

Однако, если вы собираетесь использовать для этой цели веб-службы в .NET, вам следует использовать WCF, если это вообще возможно. Среди других преимуществ WCF обрабатывает потоковую передачу и, следовательно, будет намного эффективнее с точки зрения использования памяти. Я обеспокоен тем, что если вы последуете двум (точным) предложениям, приведенным выше, вашим следующим результатом будет исключение «нехватка памяти или ресурсов», поскольку старая технология ASMX пытается загрузить в память весь файл размером 25 МБ сразу. Фактически, он может иметь в памяти несколько копий одновременно!

5
ответ дан 28 November 2019 в 01:34
поделиться

Если вы настроили использовать Веб-службы для перемещения файлов Я бы хотя бы подумал об использовании вложений WS-Attachment / DIME. Основная проблема с отправкой byte [] через веб-службы заключается в том, что они помещаются в тело SOAP, которое кодируется как строка base 64. При кодировании файлов, подобных этому , размер файла увеличивается на две трети в мыльном теле (то есть файл размером 6 МБ становится файлом размером 9 МБ по сети).

Это ' Вполне вероятно, что ваши загруженные 25 Мбайт превращаются в ОГРОМНЫЕ мыльные конверты.

Я настоятельно рекомендую прочитать это. Это может привести вас к DIME.

Вот отрывок.

Microsoft WSE Toolkit позволяет вложения будут отправлены вместе с Метод веб-службы с использованием DIME и Стандарты WS-Attachments. Хорошо изучить эти стандарты и почему они более эффективны, чем отправка больших количество двоичных данных в сети вызов службы через другие общие означает.

Надеюсь, что это поможет!

4
ответ дан 28 November 2019 в 01:34
поделиться

Это конкретно не отвечает на ваш вопрос, но в прошлом я использовал WCF для передачи имен / путей / списков файлов, а затем использовал FTP-библиотеку для передачи файла через FTP.

1
ответ дан 28 November 2019 в 01:34
поделиться

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

Например.

  • ticketId GetTicket (size)
  • UploadData (ticketId, byte [] payload) (это можно вызывать сколько угодно раз)
  • FinalizeUpload (ticketId)

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

5
ответ дан 28 November 2019 в 01:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: