WCF NetNamedPipeBinding TimeoutException в Windows Server 2008 - PullRequest
1 голос
/ 15 декабря 2011

У меня проблема с 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 Ответ

0 голосов
/ 20 декабря 2011

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

...