如何创建对基本服务方法的引用
本文关键字:服务 方法 引用 何创建 创建 | 更新日期: 2023-09-27 18:08:20
我有这样的服务类层次结构:
基础服务:
[ServiceContract()]
public interface IServiceBase
{
[OperationContract]
void BaseMethod();
}
public class ServiceBase : IServiceBase
{
public void BaseMethod()
{}
}
服务:
[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除外)
您需要使用ServiceKnownTypeAttribute class。KnownType
属性允许您为数据契约(您的基础服务)指定可接受的子类。这个示例展示了如何使用它。没有KnowType
,你总是会得到像
CommunicationException was unhandled
[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; }
}
MSDN doc