[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#基础打好,当你不写构造函数时,框架会自动帮你生成一个无参的构造函数,而一旦你自己写了有参构造,那么就不会自动生成无参,如果你需要无参的话,那必须显示声明,你可以思考下为什么要这样
------解决思路----------------------
+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());
}
------解决思路----------------------
你就不肯打开代理类,你打开改啊,改了不就行了。
------解决思路----------------------
客户端只是根据wsdl生成了一份Model和字段,但并没有任何逻辑,包括构造函数和属性(其实是方法)中的任何代码都是未知的,要不然不怀好意的人拿个工具就能拿到服务端的部分代码
------解决思路----------------------
客户端只是根据wsdl生成了一份Model层的class定义,空的字段/属性(是不会有初值的),空的构造函数,仅此而已