wcf streaming uploading chunking

WCF Chunking/Streaming



uploading (4)

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

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

Nunca lo intenté con los servicios de transmisión, pero básicamente debe hacer que WCF haga cumplir que InitializeUploadService siempre se llama antes de UploadStream.

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

Estoy usando WCF y quiero subir un archivo grande del cliente al servidor. Investigué y decidí seguir el enfoque de fragmentación descrito en http://msdn.microsoft.com/en-us/library/aa717050.aspx

Sin embargo, este enfoque (al igual que la transmisión) restringe el contrato a los métodos limitados:

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

El ejemplo utiliza el ejemplo más conveniente de cargar un archivo desde 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.

p.ej. Me gustaría algo como:

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

Gracias de antemano, Mark.


Este artículo explica cómo usar el atributo MessageHeader para forzar que las cosas pasen en el encabezado y, por lo tanto, no contar 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.



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