2016-07-05 7 views
1

통신용 명명 된 파이프를 사용하여 WCF 끝점을 제공하는 두 가지 응용 프로그램이 있습니다.명명 된 파이프를 통한 서비스 사용

하나의 응용 프로그램은 WPF 사용자 응용 프로그램이고 다른 하나는 Windows 서비스입니다. 사용자 응용 프로그램에서 win 서비스로 전화를 걸면 괜찮습니다. 그러나 Windows 서비스가 WPF의 응용 프로그램 끝점을 호출 할 때마다 시스템 .ServiceModel.CommunicationObjectFaultedException 오류가 발생하는 동안 통신 객체를 사용할 수 없다는 예외입니다.

재미있는 것은 내가 콘솔 응용 프로그램에 내 코드를 복사하여 붙여 넣을 경우가 잘 작동한다는 것입니다. 여기

내가 몇 가지 조사 후 통신 개체

 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"); 
     } 

답변

0

을 만드는 데 사용하고 코드입니다, 나는 이렇게 몇 가지 한계를 가지고, NetNamedPipesBinding 통신에 사용되는 기본 명명 된 파이프와 동일하지 않습니다 것을 발견 .

Windows 서비스가 데스크톱 응용 프로그램과 동일한 사용자 세션에서 실행되지 않고 NetNamedPipes가 서비스 컨텍스트에서 사용자 세션으로 이동할 수없는 것처럼 발생합니다. 두 가지 다른 경계 사용자 세션.

내가 찾은 대안은 WCF하지 않고, 순수 명명 된 파이프 방식을 사용 또는 양면 서비스에 계약 유형을 변경하고 사용자의 앱이 서비스에 채널을 열 수 있도록하는 것입니다.

+0

그냥 서비스가 실행중인 계정을 변경하십시오. WCF가 아닌 파이프가 필요 없습니다. – MickyD

+0

감사합니다 @MickyD,하지만이 서비스는 사용자가 최소 권한을 가진 많은 환경에 배포되므로 아무런 방법이 없습니다 동일한 사용자를 대상으로 실행됩니다. – bateloche