2010-08-28 6 views
0

J'ai créé un service WCF pour diffuser des fichiers (téléchargement). Le code du service est inférieur àComment lire le flux à partir du service WCF

public Stream GetCoverScan(List<string> productIDs) 
{ 
    FileStream stream = new FileStream("", FileMode.Open, FileAccess.Read); 
    return stream; 
} 

Quelqu'un peut-il me dire comment le consommer du côté client. J'ai déjà créé un proxy sur le client et je peux voir la méthode en créant un objet du service, mais comment puis-je lire le flux.

S'il vous plaît conseiller

Configuration

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="StreamedHttp" transferMode="StreamedResponse" 
        maxReceivedMessageSize="67108864"> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
    <services> 
     <service name="Streaming.Service1" 
       behaviorConfiguration="Streaming.Service1Behavior"> 
      <endpoint address="" bindingConfiguration="StreamedHttp" 
         binding="basicHttpBinding" contract="Streaming.IService1"> 
      </endpoint> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="Streaming.Service1Behavior"> 
       <serviceMetadata httpGetEnabled="true"/> 
       <serviceDebug includeExceptionDetailInFaults="false"/> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 

Contrat

[ServiceContract] 
public interface IService1 
{ 
    [OperationContract] 
    string GetData(string name); 

    [OperationContract] 
    System.IO.Stream GetCoverScan(List<string> productIDs); 
} 

liaisons

</bindings> 
+1

Pouvez-vous nous dire quelle est la signature de la méthode proxy générée? –

+0

bien que la chose confuse quand je vois la signature de la méthode de proxy qui est quand je fais "obj.GetCoverScan" (obj est l'objet de mon service) je peux voir que son type de retour est array byte et il prend le tableau de chaînes paramètre. – Amit

Répondre

4

Vous avez besoin de configure streaming sur la liaison que vous utilisez. Le streaming est pris en charge pour BasicHttpBinding, NetTcpBinding et NetNamedPipeBinding. Donc, si vous avez un BasicHttpBinding, votre configuration devrait ressembler à ceci:

<basicHttpBinding> 
    <binding name="HttpStreaming" maxReceivedMessageSize="67108864" 
      transferMode="StreamedResponse"/> 
</basicHttpBinding> 

-je utiliser StreamedResponse ici parce que vous avez seulement une réponse qui devrait être un cours d'eau, pas une demande.

La façon dont vous lisez le flux lui-même dépend de ce qu'il contient. Supposons que vous envoyez un fichier texte sur un flux, vous pouvez utiliser un StreamReader:

var reader = new StreamReader(service.GetCoverScan(...)); 
string contents = reader.ReadToEnd(); 

Si vous envoyez un fichier xml, vous pouvez le lire par XDocument:

var doc = XDocument.Load(service.GetCoverScan(...)); 

Cela dépend vraiment de ce que vous envoyez sur le fil.

+0

Roanld, merci pour la réponse, ouais je l'ai déjà fait. Amit

+0

ronald, pourriez-vous s'il vous plaît me conseiller sur la façon puis-je obtenir le flux à côté client? Darin (ci-dessus) conseillé d'utiliser le suivant byte [] resultat = proxy.GetCoverScan (productIDs); File.WriteAllBytes ("toto.dat ", résultat); Mais en utilisant ce sera tampon la réponse je suppose mais je veux diffuser.Cela est un peu confus s'il vous plaît aider merci – Amit

+0

Le proxy client généré devrait avoir une signature qui renvoie un flux, ** pas ** un tableau d'octets, je l'ai testé moi-même, donc quelque chose ne va pas en générant le client, pouvez-vous ajouter votre configuration à votre question? –

0

Si vous mentionnez

response.ContentType = "text/xml"

juste avant flux de retour, l'application de réception peut connaître le type de flux peut ainsi invoquer de manière standard de flux comme référence.

Questions connexes