Ошибка WCF 109: ошибка при чтении из канала. Труба закрыта на стороне клиента

В моем клиентском приложении появляется следующая ошибка

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

при использовании конкретной реализации моего OperationContract. Ниже приводится краткий по сути образец. Мои DataContracts выглядят так:

[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; }
}

А мой ServiceContract выглядит так:

[ServiceContract] открытый интерфейс IAuthentication {

[OperationContract]
[WebGet]
Person GetDeveloper();

[OperationContract]
[WebGet]
Person GetArchitect();

}

Я реализую эту услугу как следующий класс:

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;
        }
}

Примечание. Оба метода возвращают один и тот же тип, только один создает экземпляр Person и возвращает его, в то время как второй метод создает экземпляр Employee, который также является человеком.

Когда я вызываю его с клиента, я получаю ошибку не на сервере, а на стороне клиента:

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));

и вывод:

Подключение к службе аутентификации ... GetDeveloper OK: Asghar Panahy Произошла ошибка чтения из канала: De pipe is beëindigd. (109, 0x6d).

Может ли кто-нибудь помочь мне в этом? Асгар


person Community    schedule 09.07.2009    source источник
comment
Не могли бы вы перевести De pipe is beëindigd на английский? Кроме того, следует ли использовать WebGet с NetNamedPipeBinding?   -  person John Saunders    schedule 09.07.2009
comment
Я не знаю, но поскольку WebGet предназначен для HTTP, попробуйте удалить его и посмотрим, что произойдет.   -  person John Saunders    schedule 09.07.2009
comment
может помочь аналогичный вопрос: stackoverflow.com/questions/4872352/   -  person Adam Butler    schedule 28.11.2011


Ответы (1)


Я знаю, что вопрос немного устарел, но я все же могу кому-то помочь. У меня такая же проблема с привязкой именованного канала (с той же ошибкой).

Проблема здесь в возврате производного класса Employee. Хорошее объяснение есть здесь

Так что все должно работать нормально, если вы примените KnownTypeAttribute:

[DataContract]
[KnownType(Employee)]
public class Person
...
person Ventsyslav Raikov    schedule 29.11.2011