Потребление услуг через именованные каналы

У меня есть два приложения, которые выставляют конечные точки WCF, используя именованные каналы для связи.

Одно приложение является пользовательским приложением WPF, а другое - службой Windows, когда я звоню из пользовательского приложения в службу win, это нормально, но всякий раз, когда служба Windows вызывает конечную точку приложения WPF, я получаю System.ServiceModel.CommunicationObjectFaptedException заявляя, что объект связи не может быть использован, пока он находится в ошибочном исключении.

Самое смешное, что если я копирую и вставляю свой код в консольное приложение, он работает просто отлично.

Вот код, который я использую для создания объекта связи

        public void CallService()
        {
            using (var channel = GetServiceClient())
            {
                channel.Open();

                var service = channel.CreateChannel();

                service.DoFoo();
            }
        }

        private static ChannelFactory<IFooService> GetServiceClient()
        {
            return new ChannelFactory<IFooService>(
                new NetNamedPipeBinding
                {
                    Security = new NetNamedPipeSecurity { Mode = NetNamedPipeSecurityMode.None }
                },
                @"net.pipe://barAddress/fooService");
        }

1 ответ

Решение

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

Что происходит, так это то, что служба Windows не работает в том же сеансе пользователя, что и настольное приложение, и NetNamedPipes не может перейти из контекста службы в сеанс пользователя, так же, как она не может пересечь границу между двумя различными сеансами пользователя.

Альтернативы, которые я нашел, - это использовать подход именованных каналов без WCF или изменить тип контракта на дуплексную службу и заставить приложение пользователя открыть канал для службы.

Другие вопросы по тегам