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