2010-03-17 6 views
3

Je regardais cette discussion: How to handle large file uploads via WCF?problème avec WCF en streaming

je dois avoir un service Web hébergé chez mon fournisseur où je dois charger et télécharger des fichiers. Nous parlons de vidéos de 1 Mo à 100 Mo d'où l'approche en streaming.

Je ne peux pas le faire fonctionner, je déclare une interface:

[ServiceContract] 
    public interface IFileTransferService 
    { 

     [OperationContract] 
     void UploadFile(Stream stream); 
    } 

et tout ira bien, je mets en œuvre comme ceci:

public string FileName = "test"; 

     public void UploadFile(Stream stream) 
     { 
      try 
      { 
       FileStream outStream = File.Open(FileName, FileMode.Create, FileAccess.Write); 
       const int bufferLength = 4096; 
       byte[] buffer = new byte[bufferLength]; 
       int count = 0; 
       while((count = stream.Read(buffer, 0, bufferLength)) > 0) 
       { 
        //progress 
        outStream.Write(buffer, 0, count); 
       } 
       outStream.Close(); 
       stream.Close(); 
       //saved 
      } 
      catch(Exception ex) 
      { 
       throw new Exception("error: "+ex.Message); 
      } 
     } 

Toujours pas de problème, sa publication à mon serveur web sur l'interweb. Jusqu'ici tout va bien.

Maintenant, je fais une référence à lui et lui passera un FileStream, mais l'argument est maintenant un octet [] - pourquoi est-ce et comment puis-je obtenir la bonne façon pour le streaming?

Modifier Mon regard se lier comme ceci:

<bindings> 
     <basicHttpBinding> 
     <binding name="StreamingFileTransferServicesBinding" 
       transferMode="StreamedRequest" 
       maxBufferSize="65536" 
       maxReceivedMessageSize="204003200" /> 
     </basicHttpBinding> 
    </bindings> 

Je peux consommer sans problème, et obtenir aucune erreur - autre que mon paramètre d'entrée a changé à partir d'un flux à un octet []

Édition 2 Résolu! J'étais un peu rapide quand j'ai fait la référence sur mon client. Par accident, j'ai fait une "référence web" au lieu d'une "référence de service". Cela a résolu le problème de l'octet []/stream

+0

étiez-vous capable de faire un wsdl? Si oui, pouvez-vous ajouter cela à votre description. Je crois que cela peut être un problème de configuration dans votre liaison. –

+0

Je suppose que quand je peux le consommer et le parcourir dans mon navigateur, alors je peux générer le wsdl? –

+0

Comment faites-vous 'référence'? Est-ce un ServiceReference? –

Répondre

2

Est-ce inclus comme référence de service dans votre projet?

J'ai souvent mon service de diffusion en continu avec des objets un peu plus complexes, par exemple, au lieu de ceci:

[OperationContract] 
void UploadFile(Stream stream); 

essayer

[OperationContract] 
void UploadFile(FileDTO stream); 

[MessageContract] 
public class FileDTO : IDisposable 
{ 
    [MessageBodyMember] 
    public Stream FileStream { get; set; } 

    [MessageHeader] 
    public String FileLabel { get; set; } 
} 

L'appel sur votre client de référence de service ressemblerait à ceci:

client.UploadFile(fileLabel, fileStream); 

avec les paramètres étant String et Stream.

+0

Cela ne change rien, le flux de l'objet "composite" est toujours byte [] quand je suis sur mon client –

+0

Lire mon édition 2, et thx un tas, a négligé votre première ligne la première fois que j'ai lu votre message :-) –