2009-09-30 7 views
1

J'ai une application Silverlight (v3) qui communique avec un service WCF sur mon serveur. Une des choses que l'application Silverlight fait est de demander un fichier de données généré dynamiquement - ce fichier de données est créé par le service et doit (en fin de compte) être sauvegardé sur la machine de l'utilisateur local via SaveFileDialog.Application Silverlight demandant un fichier à partir d'un service WCF

Ma question est, quelle est la meilleure façon dans Silverlight pour obtenir ce fichier? Le fichier en question peut être assez volumineux.

Toute aide serait appréciée.

Répondre

1

Si vous savez déjà que le fichier demandé peut être assez volumineux, vous pouvez créer votre propre point de terminaison spécifique pour cette requête, qui prend en charge la diffusion en continu. Vous aurez donc un point de terminaison standard (par exemple http://yourserver:8080/YourService) que vous utiliserez pour les appels de méthode "normaux" et un second point de terminaison (http://yourserver:8085/YourService) qui prend en charge le streaming pour renvoyer le fichier avec une quantité de mémoire suffisante.

Configuration cela devrait être assez simple - à la fois sur le serveur et le client, vous devez spécifier une configuration de liaison pour supporter le streaming:

<system.serviceModel> 
    <bindings> 
    <basicHttpBinding> 
     <binding name="streamed" 
       transferMode="StreamedResponse" /> 
    </basicHttpBinding> 
    </bindings> 
    <services> 
    <service name="YourService"> 
     <endpoint name="normal" 
       address="http://yourserver:8080/YourService" 
       binding="basicHttpBinding" 
       contract="IYourServiceContract" /> 
     <endpoint name="filetransfer" 
       address="http://yourserver:8085/YourService" 
       binding="basicHttpBinding" 
       bindingConfiguration="streamed" 
       contract="IYourServiceContract" /> 
    </service> 
    </services> 
</system.serviceModel> 

Sur le client, bien sûr, vous devriez avoir les deux extrémités à l'intérieur d'une étiquette <client>, mais sinon, tout devrait être le même.

Le "transferMode" est "tamponné" par défaut, par ex. le message entier est tamponné et envoyé dans un bloc. Vos autres options sont "Streamed" (streaming dans les deux sens), "StreamedRequest" (si vous avez vraiment de grosses requêtes) ou "StreamedResponse" (si seulement la réponse, le fichier en cours de transfert, est vraiment grand).

Dans ce cas, vous disposez d'une seule méthode sur votre service qui renvoie un flux (c'est-à-dire le fichier). Depuis votre client, lorsque vous appelez cette méthode de service, vous récupérez un flux que vous pouvez ensuite lire en morceaux, comme un MemoryStream ou un FileStream.

Marc

Questions connexes