如何创建对基本服务方法的引用

本文关键字:服务 方法 引用 何创建 创建 | 更新日期: 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