Потребление услуг через именованные каналы
У меня есть два приложения, которые выставляют конечные точки 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 или изменить тип контракта на дуплексную службу и заставить приложение пользователя открыть канал для службы.