2008-11-27 8 views
12

Estoy usando WCF y quiero cargar un archivo grande desde el cliente al servidor. He investigado y decidió seguir el enfoque CHUNKING esbozado en http://msdn.microsoft.com/en-us/library/aa717050.aspxWCF Chunking/Streaming

Sin embargo, este enfoque (al igual que en streaming) restringe el contrato para signitures método limitadas:

[OperationContract(IsOneWay=true)] 
[ChunkingBehavior(ChunkingAppliesTo.InMessage)] 
void UploadStream(Stream stream); 

El ejemplo utiliza el ejemplo más conveniente de cargar un archivo de una ruta fija y guardarlo en una ruta fija en el servidor. Por lo tanto, mi pregunta es ¿cómo paso parámetros adicionales para especificar cosas como nombre de archivo, ruta de archivo, etc.

por ej. Me gustaría algo así como:

[OperationContract(IsOneWay=true)] 
[ChunkingBehavior(ChunkingAppliesTo.InMessage)] 
void UploadStream(Stream stream, String filePath); 

Gracias de antemano, Marcos.

Respuesta

3

Puede hacer que su servicio sea de sesión y tener un método de inicialización en el contrato con la propiedad IsInitiating establecida en true. Algo así como:

[OperationContract(IsInitiating = true)] 
void InitializeUploadService(string filename); 

[OperationContract(IsOneWay = true, IsInitiating = false)] 
[ChunkingBehavior(ChunkingAppliesTo.InMessage)] 
void UploadStream(Stream stream); 

nunca he intentado con servicios de streaming pero básicamente se debería hacer cumplir WCF que InitializeUploadService siempre se llama antes de UploadStream.

Más documentación se puede encontrar aquí: http://msdn.microsoft.com/en-us/library/system.servicemodel.description.operationdescription.isinitiating.aspx

13

This article se explica cómo utilizar el atributo MessageHeader de forzar las cosas que se pasan en la cabecera, y por lo tanto no cuenta como un parámetro. Por lo tanto, en lugar de pasar una secuencia y otros metadatos, cree una clase que tenga el atributo MessageContract y marque todos los metadatos como MessageHeader. Luego, marque la transmisión como un MessageBodyMember (que el artículo incorrecto llama "MessageBody"). Haga que su método UploadStream tome un único parámetro cuyo tipo sea el de la clase MessageContract que acaba de crear. Lo he hecho con éxito, pero no lo he hecho a la par con la fragmentación. Buena suerte.

1

Me gustaría ver MessageContracts y añadir esos valores como encabezados de los mensajes a su objeto. Esto debería permitirle pasar la secuencia y cualquier valor relacionado con la secuencia como encabezados de mensaje.