2011-12-15 3 views
1

WCF NetNamedPipeBinding에 문제가 있습니다. Windows XP 시스템에서 Visual Studio 2008을 통해 서버 및 클라이언트 코드를 실행하면 모든 것이 잘 동작합니다. 그러나 서버를 Windows 서비스로 배포하고 Windows Server 2008에 클라이언트 응용 프로그램을 설치하자마자 계약 메서드를 사용하려고 할 때마다 클라이언트 끝에서 TimeoutException이 발생합니다. 그것은 성공적으로 클라이언트를 만들고 그것을 열 수 있지만 어떤 메서드를 호출 할 수없는 것 같습니다.WCF NetNamedPipeBinding TimeoutException (Windows Server 2008)

서비스 초기화 코드 :

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없이 서비스 메서드 중 하나를 호출 할 수 없습니다.

+0

좋아, 내 앱이 어떤 바인딩 유형에서도 작동하지 않습니다. 대신 netTcpBinding을 테스트하기 위해 Add (int n1, int n2)라는 새로운 서비스가있는 새로운 프로젝트를 작성했습니다. installutil.exe를 사용하여 대상 2008 서버에 서비스를 수동으로 설치했고 클라이언트에서 서비스 참조 업데이트를 수행 한 다음 문제없이 프로그램을 실행했습니다. 같은 구성을 원래 서비스에 복사하려고했지만 작동하지 않으려 고했지만 ... * rips hair out *! – templar112

답변

0

다양한 바인딩을 시도하고 기본으로 돌아가 보니 디버깅을 위해 Visual Studio를 사용하지 않는 한 샘플 프로그램이 작동했지만 프로그램이 작동하지 않는 것으로 나타났습니다. 나는 그 시점에서 내 자신의 코드로 계속 진행되어야한다고 결정했다. 디버깅을 단순화하기 위해 바인딩의 모든 보안을 해제했습니다.

무슨 일이 벌어 질지 판단하기 위해 내 서비스의 OnStart 메소드에있는 대부분의 명령문을 주석 처리하기 시작했습니다. 나는 ServiceHost를 초기화하는 코드를 제외한 모든 것을 주석 처리했다. 마술처럼, 내 클라이언트는 이제 서비스와 성공적으로 통신 할 수 있습니다. 그런 다음 클라이언트가 갑자기 TimeoutException을 다시 제공 할 때까지 OnStart 메서드에서 각 코드 줄의 주석 표시를 제거하기 시작했습니다.

"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를 사용하여 서비스로 할 수 있다는 것입니다 클라이언트 연결 문제가 없습니다. 어쩌면 거기에있는 누군가가 이것에 대한 이유에 대해 약간의 조명을 제공 할 것입니다. 아니면 내 코드가 적절히 설계되지 않았을 수 있습니다.