我有这样的服务类层次结构:
基础服务:
[ServiceContract()]
public interface IServiceBase
{
[OperationContract]
void BaseMethod();
}
public class ServiceBase : IServiceBase
{
public void BaseMethod()
{}
}
服务A:
[ServiceContract()]
public interface IServiceA : IServiceBase
{}
public class ServiceA : ServiceBase, IServiceA
{}
服务B:
[ServiceContract()]
public interface IServiceB : IServiceBase
{}
public class ServiceB : ServiceBase, IServiceB
{}
在客户端,我通过Visual Studio"添加服务引用"为ServiceA和ServiceB创建了两个代理类。工具:
ProxyA proxyServiceA;
ProxyB proxyServiceB;
这些是关于两种不同服务的引用(尽管在服务器端有一个基类)。
我想以相同的方式通过这些代理调用BaseService中的方法。例如,我想将这些代理作为参数传递给方法并调用其BaseService方法,如下所示:
// somewhere on the client side
WorkMethod(proxyServiceA);
WorkMethod(proxyServiceB);
// Something like this, BUT I DON'T REALLY KNOW WHAT TYPE OF PARAMETER TO USE
void WorkMethod(ProxyBase proxyBase)
{
proxyBase.BaseMethod();
}
但是怎么做,要使用什么类型的参数(请记住,这些代理是没有BaseService共同祖先的不同类)?
换句话说,在服务器端,已知ServiceA和ServiceB具有共同的祖先,并且可以调用基本方法,但如何在客户端进行此操作?
是否有可能在客户端上获得一些被认为是这两个代理的基类的类?(当然除了System.ServiceModel.ClientBase)
答案 0 :(得分:0)
您需要使用 ServiceKnownTypeAttribute 类。 KnownType
属性允许您为数据协定(您的基本服务)指定可接受的子类。此示例显示了它的使用方法。没有KnowType
,你总会得到像
CommunicationException未处理
[DataContract]
[KnownType( typeof( Student ) )]
[KnownType( typeof(Teacher) )]
public abstract class BaseService
{
[DataMember]
public int Code { get; set; }
[DataMember]
public string Name { get; set; }
}
[DataContract]
public class Student : BaseService
{
[DataMember]
public int StudentId { get; set; }
}
[DataContract]
public class Teacher : BaseService
{
[DataMember]
public int TeacherId { get; set; }
}