2010-03-08 1 views
4

J'essaie d'extraire une grande quantité de données d'un service Web WCF. La demande est assez petite et le message de réponse sera très grand. Actuellement, le service Web lance des exceptions SystemOutOfMemory en raison d'une limitation sur IIS6 pour la mémoire allouée (~ 1,4 Go).Meilleures pratiques pour la réponse en continu du service Web WCF

J'ai lu dans certains blogs que l'implémentation du streaming résoudrait mon problème.

Quelqu'un peut-il partager ses expériences sur ce sujet? Je suis particulièrement intéressé par tout exemple de code côté service & côté client pouvant être partagé ou toute recommandation/meilleure pratique. MemoryStream vs FileStream? Le type de retour doit être Stream, Message, Byte []?

Mon opération se présente comme suit: (En général, il retournera un grand nombre d'éléments dans le tableau de réponse, ~ éléments 200K)

MediumSizeResponseClass[] GetData(SmallSizeRequestClass request) 

Répondre

4

Si vous voulez diffuser en arrière que la réponse, utilisez transferMode=streamedResponse dans votre configuration de liaison. Cela garantit que seule la réponse renvoyée sera diffusée. La valeur de retour d'une fonction de diffusion doit être Stream. Vous pouvez alors lire à partir de ce flux et faire tout ce que vous devez faire avec (stocker, analyser, etc.).

Donc, fondamentalement, vous auriez un contrat de service quelque chose comme ceci:

[ServiceContract] 
interface IYourService 
{ 
    [OperationContract] 
    Stream GetData(SmallSizeRequestClass request); 
} 

Sur le serveur, vous fondamentalement il suffit d'écrire à un flux, alors que sur le client, vous lisez du flux. Avez-vous consulté les documents MSDN au WCF Streaming?

+0

Voir également http://msdn.microsoft.com/en-us/library/ms789010.aspx pour des exemples qui se trouvent en bas de la page associée à marc. – Xiaofu

+0

Thansk Mark, je suis en quelque sorte familier avec les bases de la mise en œuvre de streaming. Je sais qu'il y a différentes façons de l'implémenter, certains développeurs utiliseront un message comme type de retour par opposition à une classe Stream. Certains utiliseront un FileStream alors que d'autres un MemoryStream. J'essaie de recueillir des commentaires, contre un avantage sur les différentes implémentations pour le streaming en WCF. – Damian

+0

@Damian: ok, excellent. Bien, je n'ai pas eu beaucoup d'expérience de première main avec le streaming en WCF moi-même, mais je dirais: utiliser n'importe quel flux a du sens. Ça doit être un cours d'eau, un cours d'eau, un cours d'eau - mais quel type est largement hors de propos. Si vous avez déjà des fichiers sur le serveur, utilisez FileStream. Si vous devez charger un blob à partir d'une table de base de données, utilisez un MemoryStream. Je ne suis pas au courant de problèmes majeurs liés à l'utilisation d'un type de flux par rapport à un autre. Mais peut-être que quelqu'un d'autre peut nous éclairer un peu plus! –

Questions connexes