서비스의 메서드 서명 (예 : 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를 노출하면 유형 변환이 실패합니다.
이 문제가 해결 되었습니까? 또는 나는 잘못된 방식으로 그것을하고있다.