2009-05-13 24 views
8

Estamos creando un servicio WCF que necesita de 2 a 4 archivos de imagen (pequeños-de aproximadamente 2k-5k cada uno) enviados como parámetros de entrada, así como aproximadamente 6 parámetros de campo de texto. Los datos enviados simplemente consisten en unos pocos valores de texto.¿Cuál es la mejor manera de enviar múltiples archivos a un servicio WCF?

Entiendo que se puede enviar un solo archivo como una secuencia, pero no estoy seguro de cómo enviar varios archivos.

Los clientes en este caso serán terceros, para quienes nos gustaría que la interacción con nuestro servicio WCF sea lo más simple posible.

Respuesta

24

Probablemente haya muchas maneras de lograr esto, pero aquí están mis pensamientos. Tenga en cuenta que acabo de incluir un número arbitrario de cadenas, puede agregar/eliminar según sea necesario.

Primero, querrá un tipo de objeto de "entrada" que se pasará a su servicio WCF que contiene sus imágenes y valores de cadena. Observe que la propiedad Images es una matriz de matrices de bytes; esto es para que pueda incluir múltiples imágenes.

[DataContract] 
public class InputObject 
{ 
    [DataMember] 
    public byte[][] Images { get; set; } 

    [DataMember] 
    public string FirstValue { get; set; } 

    [DataMember] 
    public string SecondValue { get; set; } 
} 

A continuación, usted querrá un objeto que va a devolver su servicio WCF ...

[DataContract] 
public class ReturnObject 
{ 
    [DataMember] 
    public string FirstValue { get; set; } 

    [DataMember] 
    public string SecondValue { get; set; } 
} 

Su ServiceContract se verá así.

[ServiceContract] 
public interface IService1 
{ 
    [OperationContract] 
    ReturnObject UploadData (InputObject input); 
} 

Y a su clase de servicio les gusta esto.

public class Service1 : IService1 
{ 
    public ReturnObject UploadData (InputObject input) 
    { 
     // Do your thing with InputObject data 

     ReturnObject returnObject = new ReturnObject 
             { 
              FirstValue = "MyFirstValue" , 
              SecondValue = "MySecondValue" 
             }; 

     return returnObject; 
    } 
} 

Tendrá que asegurarse de que las consolidaciones de su servicio son apropiadas para el envío de datos de imagen para aumentar algunos de los límites por defecto es apropiado. Aquí hay un enlace de ejemplo de la configuración de mi servicio.

<wsHttpBinding> 
    <binding name="Service1Binding" maxReceivedMessageSize="1000000"> 
    <readerQuotas maxArrayLength="1000000" 
        maxBytesPerRead="1000000" 
        maxDepth="1000000" 
        maxNameTableCharCount="1000000" 
        maxStringContentLength="1000000"/> 
    </binding> 
</wsHttpBinding> 

Asegúrese de especificar esto como su configuración de enlace para su servicio.

<endpoint address="" 
      binding="wsHttpBinding" 
      contract="WcfService5.IService1" 
      bindingConfiguration="Service1Binding"> 

Ahora todo lo que tiene que hacer es hacer referencia a esto del servicio de su cliente y llámelo.

var images = new byte[2][]; 
images[0] = System.IO.File.ReadAllBytes(@"D:\Development\TestImage.bmp"); 
images[1] = System.IO.File.ReadAllBytes(@"D:\Development\TestImage.jpg"); 

var input = new InputObject 
       { 
        Images = images , 
        FirstValue = "MyFirstValue" , 
        SecondValue = "MySecondValue" 
       }; 

var client = new Service1Client(); 
client.UploadData(input); 

la esperanza que esto te ayuda ...

+0

Un muy detallado y fácil de seguir el ejemplo. ¿Esto lo hizo por ti NagaMensch? Si es así, creo que merece una aceptación, ¿no? –

+0

NagaMensch, ¿esto respondió a tu pregunta? –

+0

Sí, esto fue muy útil. Terminé usando una variante de esto, que era una colección de Byte []. – alchemical

Cuestiones relacionadas