WCF NetNamedPipeBinding TimeoutException в Windows Server 2008
У меня проблема с WCF NetNamedPipeBinding. Когда я запускаю свой код сервера и клиента через Visual Studio 2008 на компьютере с Windows XP, все работает нормально. Но как только я развертываю свой сервер в качестве службы Windows и устанавливаю клиентское приложение в Windows Server 2008, я получаю исключение TimeoutException на стороне клиента всякий раз, когда пытаюсь использовать любой из методов контракта. Кажется, что я могу успешно создать клиента и открыть его, но не могу вызвать ни один из методов.
Код инициализации услуги:
Uri baseAddress = new Uri("http://localhost:8500/xNet/xNetService");
string address = "net.pipe://localhost/xNet/xNetService";
_xNetAPIServiceHost = new ServiceHost(typeof(xNetService), baseAddress);
NetNamedPipeBinding binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
_xNetAPIServiceHost.AddServiceEndpoint(typeof(IServiceAPI), binding, address);
// Add a mex endpoint
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
smb.HttpGetUrl = new Uri("http://localhost:8501/xNet/xNetService/mex");
_xNetAPIServiceHost.Description.Behaviors.Add(smb);
_xNetAPIServiceHost.Open();
Код инициализации клиента:
string address = "net.pipe://localhost/xNet/xNetService";
NetNamedPipeBinding binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
_serviceClient = new ServiceAPIClient(binding, new EndpointAddress(address));
_serviceClient.Open();
Служба Windows работает как "Локальная системная учетная запись". Я в недоумении относительно того, в чем проблема. Я не знаю, если это проблема с учетной записью безопасности, или если даже именованный канал открыт? Я предположил бы, что, поскольку я могу успешно создать и открыть клиентскую часть, он, по крайней мере, нашел названный канал. Я просто не могу вызвать ни один из сервисных методов без TimeoutException.
1 ответ
Попробовав различные привязки и вернувшись к основам, я заметил, что примеры программ работают, но моя не работает, если я не использую Visual Studio для отладки. В тот момент я решил, что это должно быть что-то, что происходит с моим собственным кодом. Чтобы упростить отладку, я отключил все средства защиты в привязке.
Я начал комментировать большинство операторов в методе OnStart моего сервиса, чтобы определить, что может происходить. Я закомментировал все, кроме кода, который инициализирует ServiceHost. Волшебным образом мой клиент теперь мог успешно общаться с сервисом. Затем я начал раскомментировать каждую строку кода в методе OnStart, пока мой клиент снова не начал выдавать мне исключение TimeoutException.
Мой класс обслуживания, скажем, "MyAPI", реализует контракт "IMyAPI". Наряду с использованием класса "MyAPI" в качестве службы WCF, я также использовал экземпляр класса "MyAPI" внутри своей службы для выполнения различных задач ("внутренних" методов). В моем методе OnStart я сначала создал экземпляр класса "MyAPI", а затем создал ServiceHost:
MyAPI API = new MyAPI();
ServiceHost service = new ServiceHost(typeof(MyAPI));
Я не получал никаких ошибок или исключений, так что оказалось, что все в порядке, но на самом деле я не смог подключиться к сервису с помощью клиента. Как только я изменил порядок вышеприведенных утверждений, клиент снова начал работать:
ServiceHost service = new ServiceHost(typeof(MyAPI));
MyAPI API = new MyAPI();
Я не уверен, ПОЧЕМУ это происходит, все, что я знаю, это то, что я могу использовать свой API внутри и в качестве службы без каких-либо проблем с подключением клиента. Может быть, кто-то прояснит причины этого, или, возможно, мой код не спроектирован должным образом.