2010-03-23 3 views
2

서비스의 메서드 서명 (예 : int, string)에 간단한 데이터 형식 만 있습니다. 내 서비스 클래스는 IMathService라고하는 단일 ServiceContract 인터페이스를 구현하며,이 인터페이스는 다른 기본 인터페이스 인 IAdderService에서 차례로 상속받습니다. 인터페이스 계약 인 IAdderService를 사용하여 MathService를 단일 엔드 포인트의 서비스로 노출하고자합니다. 그러나 IMathService에 대해 알고있는 일부 임상가는 해당 단일 종점에서 IMathService가 제공하는 추가 서비스에 액세스 할 수 있어야합니다. 즉, IAdderService를 IMathService에 typecasting하면됩니다.단일 끝점의 WCF 서비스에서 다중 상속 서비스 계약 인터페이스를 표시하는 방법

//Interfaces and classes at server side 
[ServiceContract] 
public interface IAdderService 
{ 
[OperationContract] 
int Add(int num1, int num2); 
} 

[ServiceContract] 
public interface IMathService : IAdderService 
{ 
[OperationContract] 
int Substract(int num1, int num2); 
} 

public class MathService : IMathService 
{ 
#region IMathService Members 
public int Substract(int num1, int num2) 
{ 
    return num1 - num2; 
} 
#endregion 

#region IAdderService Members 
public int Add(int num1, int num2) 
{ 
    return num1 + num2; 
} 
#endregion 
} 

//Run WCF service as a singleton instace 
MathService mathService = new MathService(); 
ServiceHost host = new ServiceHost(mathService); 
host.Open(); 

서버 측 구성 :

<configuration> 
    <system.serviceModel> 
    <services> 
      <service name="IAdderService" 
     behaviorConfiguration="AdderServiceServiceBehavior"> 
     <endpoint address="net.pipe://localhost/AdderService" 
     binding="netNamedPipeBinding" 
     bindingConfiguration="Binding1" 
     contract="TestApp.IAdderService" /> 
     <endpoint address="mex" 
     binding="mexNamedPipeBinding" 
     contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="net.pipe://localhost/AdderService"/> 
      </baseAddresses> 
     </host> 
      </service> 
      </services> 
     <bindings> 
     <netNamedPipeBinding> 
     <binding name="Binding1" > 
      <security mode = "None"> 
      </security> 
      </binding > 
     </netNamedPipeBinding> 
     </bindings> 

     <behaviors> 
     <serviceBehaviors> 
    <behavior name="AdderServiceServiceBehavior"> 
      <serviceMetadata /> 
     <serviceDebug includeExceptionDetailInFaults="True" /> 
    </behavior> 
     </serviceBehaviors> 
     </behaviors> 
    </system.serviceModel> 
    </configuration> 

클라이언트 측 imeplementation :

IAdderService adderService = new 
ChannelFactory<IAdderService>("AdderService").CreateChannel(); 
int result = adderService.Add(10, 11); 

IMathService mathService = adderService as IMathService; 
result = mathService.Substract(100, 9); 

클라이언트 측 구성 : 코드와 설정 이상 사용

<configuration> 
     <system.serviceModel> 
      <client> 
      <endpoint name="AdderService" address="net.pipe://localhost/AdderService" binding="netNamedPipeBinding" bindingConfiguration="Binding1" contract="TestApp.IAdderService" /> 
      </client> 

      <bindings> 
      <netNamedPipeBinding> 
     <binding name="Binding1" maxBufferSize="65536" maxConnections="10"> 
      <security mode = "None"> 
      </security> 
     </binding > 
      </netNamedPipeBinding> 
      </bindings> 
     </system.serviceModel> 
     </configuration> 

나는 할 수 없습니다입니다 형 변환 IAdd erService를 IMathService에 설치하면 실패하고 클라이언트 측에서 IMathService의 null 인스턴스를 얻습니다.

내가 관찰 한 바에 따르면 서버가 IMathService를 클라이언트에 노출하면 클라이언트가 안전하게 IAdderService로 유형 변환 할 수 있고 그 반대도 가능합니다. 그러나 서버가 IAdderService를 노출하면 유형 변환이 실패합니다.

이 문제가 해결 되었습니까? 또는 나는 잘못된 방식으로 그것을하고있다.

답변

0

관찰 한 것처럼 AdderService 대신 파생 된 서비스 (MathService)를 노출해야합니다.

WCF는 실제로 AdderService가 실제로 MathService 인터페이스를 구현하는 MathService라는 것을 알지 못합니다. AdderService로 간주되므로 파생 클래스에 캐스트 할 수 없습니다.

0

IAdderService 엔드 포인트 대신 IMathService 엔드 포인트를 사용한다는 것을 제외하고는 귀하의 상황을 정확히 복제했습니다.

IAdderService adderService = new ChannelFactory<IMathService>("MathService").CreateChannel(); 
int result = adderService.Add(10, 11); 

IMathService mathService = adderService as IMathService; 
result = mathService.Substract(100, 9); 

이것은 저에게 유용합니다. 기본 유형을 파생 유형으로 형변환 할 수 없습니다. 그러나 그 반대를 할 수 있습니다.