IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Communication Foundation .NET Discussion :

Passer un filestream via wcf et y écrire des données


Sujet :

Windows Communication Foundation .NET

  1. #1
    Membre confirmé
    Avatar de teddyalbina
    Homme Profil pro
    Développeur .Net,C++
    Inscrit en
    Janvier 2008
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .Net,C++

    Informations forums :
    Inscription : Janvier 2008
    Messages : 466
    Points : 568
    Points
    568
    Par défaut Passer un filestream via wcf et y écrire des données
    Salut à tous !

    J'ai créer un client et un serveur wcf auquel je passe un filestream ou le serveur va écrire des données.

    Seulement voila j'ai un exception qui est levée.

    Voici mon contrat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    namespace IOperations
    {
        [ServiceContract()]
        public interface IOO
        {
            [OperationContract]
            void Open(FileStream destination);
        }
    }

    Coté client rien de spécial:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            static void Main(string[] args)
            {
                ChannelFactory<IOO> channelFactory = new ChannelFactory<IOO>("FUCK");
                IOO c = channelFactory.CreateChannel();
                FileStream stream = new FileStream(@"C:\Users\Teddy\Desktop\teste.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
                c.Open(stream);
            }

    Au niveau du serveur voici ma fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
            public void Open(FileStream destination)
            {
                FileStream stream = new FileStream(@"F:\Visual Studio 2008\NDependProject.xml", FileMode.Open, FileAccess.Read, FileShare.Read);
                _f.CopyStreamToStream(stream, destination, (s, d, e) =>
                {
                    try
                    {
                        s.Close();
                        d.Close();
                    }
                    catch
                    {
                        Console.WriteLine("Booouuuu le bug");
                    }
                    Console.WriteLine(">>> " + e);
                });
            }
    Et ma fonction CopyStreamToStream():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
     
       public static void CopyStreamToStream(FileStream source, FileStream destination,
                                          Action<FileStream, FileStream, Exception> completed)
            {
                destination.Write(new byte[] { 0x01 }, 0, 1);
                byte[] buffer = new byte[0x1024];
                System.ComponentModel.AsyncOperation asyncOp = System.ComponentModel.AsyncOperationManager.CreateOperation(null);
                Action<Exception> done = e =>
                {
                    if (completed != null) asyncOp.Post(delegate
                    {
                        completed(source, destination, e);
                    }, null);
                };
                AsyncCallback rc = null;
                rc = readResult =>
                {
                    try
                    {
                        int read = source.EndRead(readResult);
                        if (read > 0)
                        {
                            destination.BeginWrite(buffer, 0, read, writeResult =>
                            {
                                try
                                {
                                    destination.EndWrite(writeResult);
                                    source.BeginRead(
                                        buffer, 0, buffer.Length, rc, null);
                                }
                                catch (Exception exc) { done(exc); }
                            }, null);
                        }
                        else done(null);
                    }
                    catch (Exception exc) { done(exc); }
                };
                source.BeginRead(buffer, 0, buffer.Length, rc, null);
            }
    L'exception qui est levé est:
    http://www.flickr.com/photos/2363493...13687/sizes/l/


    La ligne incriminée est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    destination.BeginWrite(buffer, 0, read, writeResult =>
    Le message d'erreur indique ligne 22 dans le client mais il n'en est rien en fait.

    Je n'arrive vraiment pas à comprend pourquoi sa plante.

    Merci de votre aide.

  2. #2
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Points : 8 538
    Points
    8 538
    Par défaut
    Citation Envoyé par teddyalbina Voir le message
    J'ai créer un client et un serveur wcf auquel je passe un filestream ou le serveur va écrire des données.
    hum, t'es sûr que c'est la bonne méthode ?

    Tu veux récupérer un fichier du serveur sur ton client, c'est ça ?
    C'est le client qui doit récupérer le stream du serveur.

    Dans ton service tu auras plutôt une fonction du type :
    Stream GetStream();
    Tu dois aussi configurer le binding dans le fichier de conf pour prendre en compte le streaming.

    Plus d'infos: http://msdn.microsoft.com/en-us/library/ms789010.aspx

  3. #3
    Membre confirmé
    Avatar de teddyalbina
    Homme Profil pro
    Développeur .Net,C++
    Inscrit en
    Janvier 2008
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .Net,C++

    Informations forums :
    Inscription : Janvier 2008
    Messages : 466
    Points : 568
    Points
    568
    Par défaut
    Merci je vais essayé cette méthode

  4. #4
    Membre confirmé
    Avatar de teddyalbina
    Homme Profil pro
    Développeur .Net,C++
    Inscrit en
    Janvier 2008
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .Net,C++

    Informations forums :
    Inscription : Janvier 2008
    Messages : 466
    Points : 568
    Points
    568
    Par défaut
    Bon alors j'ai fait des testes et WCF me dit que le mode de tramage streamed n'est pas supporte par nettcpbinding

    Voici la configuration de mon client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            <binding name="Custom" closeTimeout="00:01:00"
                     openTimeout="00:01:00" receiveTimeout="00:25:00"
                     sendTimeout="00:01:00"
                     transferMode="Streamed"
                     maxReceivedMessageSize="2147483647">
    Mon serveur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            <binding transferMode="Streamed"
                     maxReceivedMessageSize="2147483647"
                     name="Custom">
    J'ai changé mon contrat WCF pour que ma fonction Open(à renvoie un FILESTREAM.

    Voici mon code sur le serveur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            public FileStream Open()
            {
                return new FileStream(@"F:\Visual Studio 2008\NDependProject.xml", FileMode.Open, FileAccess.Read);
            }
    J'obtient une erreur Nullreferenceexception . Après avoir vérifié le filestream renvoyé par mon serveur n'est pas null en plus .

    Je ne comprend pas le problème

  5. #5
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Points : 8 538
    Points
    8 538
    Par défaut
    Tu as essayé avec les exemples à télécharger ici: http://msdn.microsoft.com/en-us/library/ms751463.aspx ?

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/05/2009, 14h31
  2. Réponses: 10
    Dernier message: 11/11/2007, 15h18
  3. [MySQL] Comment écrire des données de la bdd dans un fichier
    Par sandddy dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 07/11/2007, 16h13
  4. Réponses: 9
    Dernier message: 29/08/2007, 09h00
  5. Réponses: 5
    Dernier message: 22/02/2007, 12h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo