2010-01-22 3 views
5

우리는 WCF를 사용하여 다른 프로세스의 통신을 수신하는 .NET 프로그램을 가지고 있습니다. 명명 된 파이프를 사용했습니다.명명 된 파이프 충돌 방지

ServiceHost host = new ServiceHost(
    typeof(Something), 
    new Uri[] 
    { 
     new Uri("net.pipe://localhost") 
    }); 
host.AddServiceEndpoint(typeof(ISomething), new NetNamedPipeBinding(), "Something"); 
host.Open(); 

코드는 타사 .NET 프로그램이 설치 될 때까지 훌륭하게 작동했습니다. 이제는 "파이프 이름 'net.pipe : // localhost /'에서 다른 파이프 엔드 포인트가 이미 해당 이름에서 수신 중이므로 수신 대기 할 수 없습니다."라는 메시지와 함께 열리지 않습니다.

내 가정은 다른 프로그램이 이미 명명 된 파이프를 사용하고 있다는 것입니다. 해결 방법이 있습니까 아니면 컴퓨터의 한 프로그램 만 명명 된 파이프를 사용할 수 있습니까? 나는 당신이 파이프의 "이름"을 설정할 수있는 다른 질문에서 인상을받습니다. 그래서 다른 프로세스와 충돌하지 않습니다. 어떻게합니까?

+0

[SysInternals] (http://technet.microsoft.com/en-us/sysinternals/default.aspx)의 Handle.exe를 사용하여 현재 명명 된 파이프를 사용중인 응용 프로그램을 찾을 수 있습니다. 명령 "Handle.exe net.pipe :". [Rodney Viana의 게시물] (http://blogs.msdn.com/b/rodneyviana/archive/2011/03/22/named-pipes-in-wcf-are-named-but-not-by-you-and)를 참조하십시오. -how-to-find-the-actual-windows-object-name.aspx) – mcdon

답변

14

한 번에 여러 개의 명명 된 파이프를 사용할 수 있습니다. 그의 책 Programming WCF Services에서 Juval Lowy의 ServiceModelEx를 살펴보십시오. 명명 된 파이프를 만들면 다음과 같은 코드가 사용됩니다.

Uri baseAddress = new Uri("net.pipe://localhost/" + Guid.NewGuid().ToString());

이름이 충돌하지 않아야합니다.

+0

완벽합니다. 고마워요. –

+6

하지만 실행 중에 클라이언트가 서버 주소를 어떻게 알 수 있습니까? – IneedHelp

+0

매개 변수로 클라이언트에 전달하거나 레지스트리에 쓰거나 임시 설정 파일에 넣을 수 있습니다. – beppe9000