WCF休息服务中的协方差实现

时间:2011-01-31 10:18:09

标签: wcf wcf-rest

协方差概念可以在WCF休息服务中实现,

,即我有A级和B级继承自It。

WCF操作合约有输入参数A.我应该也可以将B传递给此操作。

我有一个JSON客户端可以访问我的EXF休息服务。

我是否有可能使用协方差概念。我应该如何在服务器和客户端中执行此操作。请帮助。

1 个答案:

答案 0 :(得分:2)

当然!唯一需要做的就是将B类添加到服务应该知道的使用ServiceKnownType属性的类型列表中。

这是一个简单的例子,我把它放在一起来证明这一点,想象一下这是你的服务合同:

using System.Runtime.Serialization;
using System.ServiceModel;

namespace WcfCovariance
{
    [ServiceKnownType(typeof(Employee))]
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        Person GetPerson();

        [OperationContract]
        Person PutPerson(Person person);
    }

    [DataContract]
    public class Person
    {
        [DataMember]
        public string Name { get; set; }
    }

    [DataContract]
    public class Employee : Person
    {
        [DataMember]
        public double Salary { get; set; }
    }
}

实施:

namespace WcfCovariance
{
    public class Service1 : IService1
    {
        static Person Singleton = new Person { Name = "Me" };

        public Person GetPerson()
        {
            return Singleton;
        }

        public Person PutPerson(Person person)
        {
            Singleton = person;

            return Singleton;
        }
    }
}

因为您已使用Employee属性告诉WCF类型ServiceKnownType,当遇到它时(在输入参数和响应中)它将能够序列化/反序列化它,是否使用JSON。

这是一个简单的客户端:

using System;
using WcfCovarianceTestClient.CovarianceService;

namespace WcfCovarianceTestClient
{
    class Program
    {
        static void Main(string[] args)
        {
            var client = new Service1Client("WSHttpBinding_IService1");

            // test get person
            var person = client.GetPerson();

            var employee = new Employee { Name = "You", Salary = 40 };
            client.PutPerson(employee);

            var person2 = client.GetPerson();

            // Employee, if you add breakpoint here, you'd be able to see that it has all the correct information
            Console.WriteLine(person2.GetType()); 

            Console.ReadKey();
        }
    }
}

将子类型传入和传出WCF服务是很常见的,但你唯一不能做的就是在你的合同中指定一个接口作为响应。

希望这有帮助。