por enviar archivos archivo .net web-services iis-7 large-file-upload

.net - enviar - ¿Cómo cargo archivos grandes(> 25MB) a un servicio web?



enviar archivo por web service c# (8)

Tengo un servicio web que toma un byte [] y lo guarda.

Esto funciona bien para archivos "pequeños", pero una vez que alcanzo cierto tamaño, el servicio web falla y devuelve "La solicitud falló con el estado HTTP 404: No encontrado".

Por lo que he visto, esta parece ser una configuración de IIS que limita el tamaño de un archivo que se puede publicar (para evitar ataques de denegación de servicio). Intenté aumentar esa configuración, pero tengo problemas para determinar qué configuración y dónde / cómo se configurará. Estoy usando IIS7 y el servicio web está hecho en .net (asmx).

En el web.config del servicio web, he agregado lo siguiente (que parecía aumentar el tamaño del archivo que puede ser aceptado, pero no todo el camino hasta este tamaño de configuración)

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

Cualquier sugerencia sobre dónde (y cómo) aumentar el tamaño del archivo que el servicio web sería muy apreciado.


Además del httpRuntime / maxRequestLength mencionado en la pregunta, parece que hay un elemento adicional que se puede agregar al archivo web.config del servicio web para permitir grandes transferencias de archivos.

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

Esto parece permitir que los archivos más grandes se carguen a través de servicios web.


Debe tener en cuenta que los servicios web no están diseñados principalmente como mecanismos de transferencia de archivos. Cualquier protocolo de transferencia de archivos diseñado para propósitos probablemente hará un mejor trabajo que un servicio web. Por ejemplo, dichos protocolos tienen más probabilidades de ocuparse de la recuperación de errores, cargas parciales, etc.

Sin embargo, si va a utilizar servicios web para este fin en .NET, debe usar WCF, si es posible. Entre otros beneficios, WCF maneja la transmisión y, por lo tanto, será mucho más eficiente en términos de uso de la memoria. Me preocupa que si sigues las dos sugerencias (precisas) anteriores, tu próximo resultado será "sin memoria o recursos", ya que la antigua tecnología ASMX intenta cargar todo tu archivo de 25 MB en la memoria a la vez. De hecho, ¡puede tener varias copias en la memoria al mismo tiempo!


Esto no responde específicamente a su pregunta, pero lo que hice en el pasado es usar WCF para transferir nombres de archivos / rutas / listados, pero luego uso una biblioteca de FTP para transferir el archivo a través de FTP.


Si está configurado para usar los servicios web para mover archivos, al menos consideraría usar archivos adjuntos WS-Attachment / DIME. El problema principal con el envío de byte [] sobre los servicios web es que se ponen en el cuerpo SOAP que se codifica como una cadena base 64. La codificación de archivos como este aumenta el tamaño del archivo hasta en dos tercios en el cuerpo del jabón (es decir, un archivo de 6 MB se convierte en un archivo de 9 MB por cable).

Es probable que su carga de 25 MB se convierta en ENORMES sobres de jabón.

Recomiendo leer esto. Lo cual podría llevarte a DIME.

Aquí hay un extracto.

WSE Toolkit de Microsoft permite enviar archivos adjuntos de gran tamaño junto con un método de servicio web utilizando los estándares DIME y WS-Attachments. Examinaremos estos estándares y por qué son más eficientes que enviar grandes cantidades de datos binarios en una llamada de servicio web a través de otros medios comunes.

¡Espero que ayude!


Si tuviera que usar servicios web y tuviera que admitir archivos muy grandes, me gustaría implementar un sistema que le permita cargar archivos en pedazos.

P.ej.

  • ticketId GetTicket (tamaño)
  • UploadData (ticketId, byte [] carga útil) (esto se puede llamar tantas veces como desee)
  • FinalizeUpload (ticketId)

Esto te permitirá dividir las grandes cargas y no almacenar demasiados datos en la memoria. La desventaja es que todavía está utilizando un mecanismo de transporte bastante ineficiente.


Solo para agregar información a las personas que buscan este web.config:

C: / Archivos de programa / Archivos comunes / Microsoft Shared / Web Extensiones de servidor / 12 / ISAPI

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

Esto solucionó nuestro problema después de solucionar este problema durante bastante tiempo.


esto funcionó para mí:

<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>


maxRequestLength está en KB, no en bytes. Esto debería darle un límite de 30 MB dentro de una ventana de tiempo de espera de 4 minutos.

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

Tener números demasiado altos puede estar impidiendo que se apliquen sus valores. Creo que me encontré con esto hace unos años cuando pensé que era un límite de bytes (memoria vaga).