3 votes

WCF Error 109 : il y avait une erreur de lecture du tuyau. Le tube est fermé du côté du client

J'obtiens l'erreur suivante sur mon application client

There was an error reading from the pipe: De pipe is beëindigd. (109,0x6d).

en utilisant une implémentation spécifique de mon OperationContract. Voici un exemple concis et concis. Mes DataContracts sont comme ceci :

[DataContract]
public class Person
{
    [DataMember]
    public string FirstName { get; set; }
    [DataMember]
    public string LastName { get; set; }
}

[DataContract]
public class Employee : Person
{
    [DataMember]
    public string Function { get; set; }
}

Et mon contrat de service ressemble à ceci :

[Contrat de service] interface publique IAuthentication {

[OperationContract]
[WebGet]
Person GetDeveloper();

[OperationContract]
[WebGet]
Person GetArchitect();

}

J'implémente ce service comme la classe suivante :

public class Authentication : IAuthentication
{
    public Person GetDeveloper()
        {
            Person architect = new Person()
            {
                FirstName = "Asghar",
                LastName = "Panahy"
            };
            return architect;
        }

        public Person GetArchitect()
        {
            Employee architect = new Employee()
            {
                FirstName = "Asghar",
                LastName = "Panahy",
                Function = "Architect"
            };
            return architect;
        }
}

Remarque : Les deux méthodes renvoient le même type, mais la première instancie une personne et la renvoie, tandis que la seconde instancie un employé, qui est aussi une personne.

Lorsque je l'appelle depuis le client, je n'obtiens pas d'erreur sur le serveur mais du côté du client :

Console.WriteLine(" Connecting to Authenticate service... ");

            NetNamedPipeBinding myBinding = new NetNamedPipeBinding("Authentication.Endpoint"); ;
            EndpointAddress myEndpoint = new EndpointAddress("net.pipe://localhost/authentication"); ;
            var myChannelFactory = new ChannelFactory<IAuthentication>(myBinding, myEndpoint);

            IAuthentication proxy = myChannelFactory.CreateChannel();
            Person person = proxy.GetDeveloper();
            Console.WriteLine(String.Format("GetDeveloper OK : {0} {1} ", person.FirstName, person.LastName));

            person = proxy.GetArchitect();
            Console.WriteLine(String.Format("GetArchitect OK : {0} {1} ", person.FirstName, person.LastName));

et la sortie est :

Connexion au service Authenticate... GetDeveloper OK : Asghar Panahy Une erreur s'est produite lors de la lecture du tube : De pipe is beëindigd. (109, 0x6d).

Quelqu'un peut-il m'aider à ce sujet ? Asghar

3voto

Bond Points 2145

Je sais que la question est un peu ancienne mais je pourrais quand même aider quelqu'un. J'ai le même problème maintenant avec la liaison named-pipe (j'obtiens la même erreur).

Le problème ici est le retour de la classe dérivée Employee. Il existe une bonne explication aquí

Cela devrait donc fonctionner correctement si vous appliquez l'attribut KnownTypeAttribute :

[DataContract]
[KnownType(Employee)]
public class Person
...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X