如果项目类型不匹配,WCF将无法反序列化列表

时间:2014-06-11 11:34:21

标签: c# wcf serialization datacontractserializer

使用WCF,假设以下服务接口:

[ServiceContract]
public interface IForDataTypeA
{
    [OperationContract]
    List<DataTypeA> GetValues();
}

[DataContract]
public class DataTypeA { }

这是在服务器端(服务主机)定义的方式。

现在,某人 - 无法访问服务器的源代码 - 尝试使用此WCF服务。他自己定义了服务接口,但意外地将数据类型的名称更改为DataTypeB

[ServiceContract]
public interface IForDataTypeA
{
    [OperationContract]
    List<DataTypeB> GetValues();
}

[DataContract]
public class DataTypeB { }

当他现在调用GetValues()(通过ChannelFactory<IForDataTypeA>时,返回的列表将始终为空,但不会抛出任何异常。

当列表中的元素无法反序列化(而不是返回空列表)时,有没有办法让WCF抛出异常?


以下是重现问题的完整代码:

using System.Collections.Generic;
using System.Runtime.Serialization;
using System.ServiceModel;

namespace TestProj
{
    [DataContract]
    public class DataTypeA { }

    [DataContract]
    public class DataTypeB { }

    [ServiceContract]
    public interface IForDataTypeA
    {
        [OperationContract]
        List<DataTypeA> GetValues();
    }

    [ServiceContract(Name = "IForDataTypeA")]
    public interface IForDataTypeB
    {
        [OperationContract]
        List<DataTypeB> GetValues();
    }

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    internal class ServiceImpl : IForDataTypeA
    {
        public List<DataTypeA> GetValues()
        {
            return new List<DataTypeA>
            {
                new DataTypeA(),
                new DataTypeA(),
            };
        }
    }

    class Program
    {
        static void Main()
        {
            var serviceHost = new ServiceHost(new ServiceImpl());
            var binding = new NetTcpBinding();
            var endpointUrl = "net.tcp://127.0.0.1:5555/MyService";

            serviceHost.AddServiceEndpoint(typeof(IForDataTypeA), binding, endpointUrl);
            serviceHost.Open();

            var channelFactory = new ChannelFactory<IForDataTypeB>(binding, endpointUrl);
            var channel = channelFactory.CreateChannel();

            List<DataTypeB> values = channel.GetValues();
            // values will always be empty
        }
    }
}

0 个答案:

没有答案