当前位置: 代码迷 >> C# >> WCF,数据约据的构造函数不执行
  详细解决方案

WCF,数据约据的构造函数不执行

热度:398   发布时间:2016-04-28 08:42:56.0
WCF,数据契约的构造函数不执行?

[DataContract]
public class Person
{
    public Person()
    {
        UserName = "张三";
    }
    [DataMember]
    public string UserName { get; set; }
}    


[ServiceContract]
public interface IService
{
    [OperationContract]
    string DoSomething(Person P);
}


public class MyService : IService   
{
    public string DoSomething(Person P)
    {
        return P.UserName;
    }
}


private void Button_Click(object sender, RoutedEventArgs e)
{
    ServiceClient client = new ServiceClient();
    string s = client.DoSomething(new Person());
    MessageBox.Show((s == null).ToString());
}

WCF的数据契约,Person类的构造函数不执行吗?构造函数中设置了UserName的值,但是客户端输出的UserName值为Null。
------解决思路----------------------
你传过去的是你的代理类Person的实例,这个类你是通过服务引用生成的,没有这样的构造函数,你传过去了一个属性UserName为空的值给服务端,服务return P.UserName返回的也是空的。
这个问题不复杂吧?
------解决思路----------------------
不,要加一个构造函数,即便他什么都不干:
public Person(){}
这个构造函数里面什么都没有,这是为序列化与反序列化服务的,需要这样一个无参的默认构造函数。
------解决思路----------------------
因为有的时候在作为集合类型的数据契约使用时,没有这样的构造函数就无法反序列化。
------解决思路----------------------
不是不执行,构造函数执行力,但因为你客户端并没有同样的构造函数,所以当你从客户端发起请求时,new出来的person默认值是null,在服务端接受到请求报文后,服务端先是new出一个person,这时候name还是如你所望,但接着赋值过程将null赋给了name,所以最终值是null
------解决思路----------------------
至于有无构造函数,建议lz先去把c#基础打好,当你不写构造函数时,框架会自动帮你生成一个无参的构造函数,而一旦你自己写了有参构造,那么就不会自动生成无参,如果你需要无参的话,那必须显示声明,你可以思考下为什么要这样
------解决思路----------------------
引用:
不是不执行,构造函数执行力,但因为你客户端并没有同样的构造函数,所以当你从客户端发起请求时,new出来的person默认值是null,在服务端接受到请求报文后,服务端先是new出一个person,这时候name还是如你所望,但接着赋值过程将null赋给了name,所以最终值是null

+1
------解决思路----------------------
昨天说那么多还在问,你自己打开代理类看下就知道了,这个帖子不要再挂着了。
------解决思路----------------------
数据契约,是关于数据的合同。没有,也不应该包括逻辑的实现。

很简单的道理,如果把服务端的实现放到代理中去,就是实现的泄漏。
------解决思路----------------------
引用:
那怎么使用构造函数呢?总得要初始化值啊


private void Button_Click(object sender, RoutedEventArgs e)
{
    ServiceClient client = new ServiceClient();
    string s = client.DoSomething(new Person(){UserName = "张三"});
    MessageBox.Show((s == null).ToString());
}
------解决思路----------------------
引用:
只能这样了吗?好麻烦哦,如果new对象的地方很多,容易出错吧,直接在构造函数中赋值初始值,就不容易出错。

你就不肯打开代理类,你打开改啊,改了不就行了。
------解决思路----------------------
客户端只是根据wsdl生成了一份Model和字段,但并没有任何逻辑,包括构造函数和属性(其实是方法)中的任何代码都是未知的,要不然不怀好意的人拿个工具就能拿到服务端的部分代码
------解决思路----------------------
客户端只是根据wsdl生成了一份Model层的class定义,空的字段/属性(是不会有初值的),空的构造函数,仅此而已
  相关解决方案