Jak wgrać Duże (>25MB) pliki do serwisu www?

Mam usługę internetową, która pobiera bajt [] i zapisuje go.

To działa dobrze dla "małych" plików, ale po osiągnięciu określonego rozmiaru Usługa sieciowa nie działa i zwraca " żądanie nie powiodło się ze statusem HTTP 404: Not Found. "

Z tego, co widziałem, wydaje się, że jest to ustawienie usługi IIS, które ogranicza Rozmiar pliku, który można opublikować (aby zapobiec atakom typu Denial of Service). Próbowałem zwiększyć to ustawienie, ale mam problem z określeniem, jakie ustawienie i gdzie/jak można ustawić to. Używam IIS7 i webservice odbywa się w. Net (asmx).

W sieci.Konfiguracja usługi internetowej dodałem następujący (co wydawało się zwiększyć rozmiar pliku, który może być zaakceptowany, ale nie aż do tego ustawienia rozmiaru)

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

Wszelkie sugestie, gdzie (i jak) zwiększyć rozmiar pliku, że serwis internetowy byłby bardzo mile widziany.

Author: ChrisHDog, 2009-06-16

8 answers

Oprócz wspomnianego w pytaniu httpRuntime/maxRequestLength, wygląda na to, że istnieje dodatkowy element, który można dodać do sieci Web usługi internetowej.plik konfiguracyjny pozwalający na transfer dużych plików.

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

Wydaje się, że umożliwia to przesyłanie większych plików za pośrednictwem usług internetowych.

 31
Author: ChrisHDog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-30 23:28:35

Należy pamiętać, że Usługi internetowe nie są zaprojektowane przede wszystkim jako mechanizmy transferu plików. Każdy specjalnie zaprojektowany protokół przesyłania plików będzie prawdopodobnie lepiej działał niż usługa internetowa. Na przykład takie protokoły są bardziej narażone na odzyskiwanie błędów, częściowe przesyłanie plików itp.

Jeśli jednak zamierzasz używać do tego celu usług internetowych w. NET, powinieneś użyć WCF, jeśli to w ogóle możliwe. Wśród innych korzyści WCF obsługuje strumieniowanie, a zatem będzie o wiele więcej wydajny pod względem wykorzystania pamięci. Obawiam się, że jeśli zastosujesz się do dwóch (dokładnych) sugestii powyżej, następnym wynikiem będą wyjątki "z pamięci lub zasobów", ponieważ stara technologia ASMX próbuje załadować cały plik 25MB do pamięci na raz. W rzeczywistości może mieć kilka kopii w pamięci jednocześnie!

 5
Author: John Saunders,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-15 23:38:33

Gdybym musiał korzystać z usług internetowych i musiał obsługiwać bardzo duże pliki, przyjrzałbym się wdrożeniu systemu, który pozwala przesyłać pliki w kawałkach.

Np.

  • ticketId GetTicket (size)
  • UploadData (ticketId, byte[] payload) (może być wywołana tyle razy, ile chcesz)
  • FinalizeUpload (ticketId)

To pozwoli Ci schować Duże uploady i nie trzymać zbyt dużo danych w pamięci. Wadą jest to, że jesteś nadal korzysta z dość nieefektywnego mechanizmu transportu.

 5
Author: Sam Saffron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-15 23:58:22

Tylko po to, aby dodać informacje do ludzi googlujących tę sieć.config:

C:\Program Files\Common Files \ Microsoft Shared \ Web Server Extensions\12 \ ISAPI

<location path="Copy.asmx"> <!-- Name of you asmx -->
    <system.webServer>
      <security>
        <requestFiltering>
          <requestLimits maxAllowedContentLength="104857600"/> <!-- 100 megs -->
        </requestFiltering>
      </security>
    </system.webServer>
  </location>

To rozwiązało nasz problem po rozwiązywaniu tego problemu przez dość długi czas.

 5
Author: sonstabo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-19 09:01:59

Jeśli jesteś nastawiony na korzystanie z usług internetowych do poruszania się po plikach, chciałbym przynajmniej rozważyć użycie ws-Attachment / DIME attachments. Głównym problemem z wysyłaniem bajtów [] przez usługi sieciowe jest to, że są one umieszczane w ciele SOAP, które jest kodowane jako ciąg podstawowy 64. Kodowanie plików takich jak Ta zwiększa rozmiar pliku aż o dwie trzecie w ciele soap (tj. plik 6 MB staje się plikiem 9 MB przez przewód).

Prawdopodobnie Twój upload 25 MB zmieni się w ogromny koperty z mydłem.

Zdecydowanie sugeruję przeczytanie tego./ Align = "left" /

Oto fragment.

Microsoft ' s GPW Toolkit pozwala na duże załączniki do wysłania wraz z Metoda serwisu internetowego z wykorzystaniem grosza i Ws-standardy załączników. Będziemy zbadać te standardy i dlaczego są bardziej efektywne niż wysyłanie dużych ilość danych binarnych w sieci wywołanie usługi przez inne wspólne znaczy.

Mam nadzieję, że pomaga!

 3
Author: Tyler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-15 23:47:34

MaxRequestLength jest w KB, nie bajtach. To powinno dać ci limit 30 MB w 4-minutowym oknie timeout.

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

Posiadanie zbyt wysokich liczb może uniemożliwić zastosowanie twoich wartości. I myślę natknąłem się na to kilka lat temu, kiedy myślałem, że to limit bajtów (mglista pamięć).

 1
Author: richardtallent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-15 23:37:36

To nie odpowiada na twoje pytanie, ale to, co robiłem w przeszłości, to używanie WCF do przesyłania nazw plików/ścieżek/listingów, ale następnie użycie biblioteki FTP do przesyłania pliku przez FTP.

 1
Author: NotDan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-15 23:41:43

To mi pomogło:

            <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
Author: Dragos Durlut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-14 17:11:56