Tenemos un servicio web (asmx) que toma un búfer de matriz de bytes y lo transmite a un servicio de archivos externo para su almacenamiento y archivo. Es llamado por un servicio de Windows que genera archivos bastante pequeños (3-5M), por lo que crear una matriz de bytes de ese tamaño y alimentarlo como un parámetro para la llamada al servicio web ha funcionado bien hasta ahora.Transmitir archivo grande a servicio web
Me han encomendado agregar un nuevo trabajo a la cola de archivos que generará potencialmente archivos de> 70M. Obviamente, un byte[]
ese tamaño abrumará la memoria del sistema, por lo que he estado buscando soluciones. El servicio web tiene un método interno que toma un FileStream
como un parámetro en lugar de un byte[]
, así que intenté hacer que el método FileStream salga a la superficie como un método Web. Actualicé las referencias en el servicio de Windows, pero sucede algo extraño: el parámetro FileStream tiene un especificador de espacio de nombres adjunto (algo así como CallingWindowsService.ExternalWebServiceFileManager.FileStream
) y este objeto especificado no toma nombre de archivo como constructor, por lo que no puedo abrir un archivo.
Estoy totalmente en el mar en cuanto a cómo acercarme a esto. ¿Alguien más ha hecho esto? Transmite grandes cantidades de datos a un servicio web, y si es así, ¿cuál es el mejor método? Mi servicio web necesitará byte[]
o FileStream
.
Mirando a través de algunos de los otros mensajes, parece que MTOM (que no está familiarizado con él) podría ser una solución, pero no estoy seguro de cómo configurarlo en mis métodos web o ponerlo en funcionamiento.
La buena noticia es que hemos decidido agregar la capacidad a un servicio WCF existente, por lo que se atiende al extremo receptor. Todavía estoy en el mar, por llamar al servicio desde mi servicio de Windows. La función que llama al servicio de transmisión de archivos toma un byte [] como parámetro, por lo que la rutina de creación de mi archivo debe devolver ese búfer. Parece que tengo que refactorizar para que el búfer se declare en la rutina de creación de archivos y esa rutina llame al servicio de forma iterativa para transmitir el archivo en fragmentos. –
¿Tal vez refactorizar todo para usar Streams en lugar de matrices de bytes? MemoryStream se puede construir a partir de una matriz de bytes. –