2011-01-25 32 views
7

¿Hay alguna manera de cargar un archivo desde el sistema de archivos local a una carpeta en un servidor utilizando servicios web ASMX (sin WCF, no preguntes por qué :)?Carga de archivos ASMX

UPD tamaño

PsFile puede ser 2-10 GB

Respuesta

2

Al desarrollar mi herramienta gratuita para cargar archivos grandes en un servidor, también estoy usando .NET 2.0 y servicios web.

Para hacer que la aplicación sea más tolerante a errores para archivos muy grandes, decidí no cargar una gran matriz byte[], sino que hago una carga "truncada".

I.e. para cargar un archivo de 1 MB, llamo a mi función SOAP de carga 20 veces, cada llamada pasa una matriz byte[] de 50 KB y la vuelve a unir en el servidor.

También cuento los paquetes, cuando uno cae, intento cargarlo nuevamente varias veces.

Esto hace que la carga sea más tolerante a errores y más receptiva en la interfaz de usuario.

Si usted está interesado, this is a CP article of the tool.

+1

Lo pensé. pero también pensé que esto podría causar un gran número de errores :) – 2xMax

+0

Sí, tomó bastante tiempo convertirlo en algo redondo. –

9

Claro:

[WebMethod] 
public void Upload(byte[] contents, string filename) 
{ 
    var appData = Server.MapPath("~/App_Data"); 
    var file = Path.Combine(appData, Path.GetFileName(filename)); 
    File.WriteAllBytes(file, contents); 
} 

luego exponga el servicio, generar un proxy cliente del WSDL, invoque, material estándar .

-

ACTUALIZACIÓN:

Puedo ver su actualización ahora sobre el manejo de archivos de gran tamaño. El MTOM protocol with streaming que está integrado en WCF está optimizado para manejar tales escenarios.

+0

buffer ??? Creo que quieres decir contenido ... – scartag

+0

¿Qué hay de los archivos grandes? – 2xMax

+0

@scartag, sí, eso es lo que quise decir. –

0

Para archivos muy grandes, la única manera eficiente de enviarlos a servicios web es con MTOM. Y MTOM es solo supported in WCF, que ha descartado. La única forma de hacer esto con los servicios web antiguos de .asmx es la respuesta que dio @Darin Dimitrov. Y con esa solución, tendrá que sufrir el costo del archivo codificado en base64 (33% más de ancho de banda).

0

Teníamos el mismo requisito, básicamente cargar un archivo a través de HTTP POST usando los controles estándar FileUpload en el lado del cliente. Al final acabamos de agregar una página ASPX al proyecto de servicio web ASMX (después de todo es solo un proyecto web) - esto nos permitió cargar a, por ejemplo, http://foo/bar/Upload.aspx cuando el servicio web estaba en http://foo/bar/baz.asmx. Esto mantuvo la funcionalidad dentro del servicio web, aunque usaba una página web separada.

Esto podría o no ajustarse a sus requisitos, el enfoque @Darins también funcionaría como una solución, pero tendría que hacer modificaciones en el lado del cliente para eso, que no era una opción para nosotros.