Visual Studio 的“添加服务引用”如何反序列化对象?

use*_*716 1 .net c# wcf serialization visual-studio

在项目中Visual Studio 2013使用时如何反序列化对象Add Service Reference?我问是因为我有以下课程:

    public class RTMImagePackage
    {
        private int maxImages = 15;

        [DataMember(EmitDefaultValue = false)]
        public int MaxImages
        {
            get { return this.maxImages; }
            private set { this.maxImages = value; }
        }

        [OnDeserialized]
        void OnDeserialized(StreamingContext c)
        {
            if (maxImages == 0)
            {
                maxImages = 15;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果使用本地IIS,然后我自我主机创建一个单独的项目,并使用添加此WCF服务Add Service Reference的任何新的实例RTMImagePackage总是有一个MaxImages0值,即使我在多个地方将其设置为15,甚至里面开头用的方法OnDeserialized

如果我加入一些断点,我可以看到该OnDeserialized方法甚至从未在 Web 服务端调用,即使我尝试使用适当的断点更新服务引用。

基本上我试图保证客户端将始终具有MaxImages当它产生的代理类设置为15 WITHOUT不必使用部分类。有没有明确的方法来做到这一点?我检查了其他答案,他们的方法是使用OnDeserializedorOnDeserializing但这似乎对我不起作用。

有小费吗?

JLR*_*she 5

Visual Studio 无法使用“添加服务引用”向导1探查有关基础 .NET 类的信息。它所要做的就是您的 WCF 服务生成的 WSDL,并且该 WSDL 不会以任何方式说明您的服务的具体类之一的数据成员之一具有初始值为 15 的支持字段。

此外,OnDeserialized如果在反序列化期间该支持字段当前为 0 ,则您的客户无法知道您的类的方法将该支持字段设置为 15。OnDeserialized是一种在服务从客户端接收数据时运行的方法。该OnDeserialized方法的行为不会作为服务接口的一部分公开。

据我所知,我在 WCF 界面中看不到任何指示自定义默认值的方法,而且我能找到的有关使用自定义默认值的所有建议都推荐了OnDeserialized您已经在使用的方法。

但是,如果您使用 ChannelFactories 而不是 Add Service Reference 生成的代理,您的客户端应用程序可以使用 .NET 定义来定义您的服务数据对象,并且这些定义可以在您的服务和您的客户端之间共享。换句话说,您的客户端可以实例化RTMImagePackage在共享程序集中定义的实例,而不是使用服务代理类。这应该允许您执行一些操作,例如包含默认值和其他无法完全从 WSDL 确定的内容。

关于 ChannelFactories 的更多信息可以在这里找到:http : //www.codeproject.com/Tips/558163/Difference-between-Proxy-and-Channel-Factory-in-WC


1实际上,您的服务接口不应该首先定义在 aclass中。它应该在一个interface.