我的团队正在开发一个WCF服务来与数据库表进行通信。最近,我们注意到如果我们在某些表中插入新记录,整数和布尔值将不会保存到记录中,但字符串可以正常工作。
服务中接收DataContract类作为参数的函数似乎对其所有非字符串属性都有空值。
我已经设置了一个新类来测试它:
[DataContract]
public class MyObject
{
private string _Name;
[DataMember]
public string Name
{
get { return _Name; }
set { _Name = value; }
}
private int? _TestInt;
[DataMember]
public int? TestInt
{
get { return _TestInt; }
set { _TestInt = value; }
}
public MyObject()
{
_Name = "";
_TestInt = 0;
}
}
我已将功能添加到我的服务中,只需返回上述类中属性的值:
[OperationBehavior]
public string GetMyName(MyObject myObject)
{
return myObject.Name;
}
[OperationBehavior]
public int? GetMyTestInt(MyObject myObject)
{
return myObject.TestInt;
}
我已在客户端应用程序上配置服务引用,以便不在引用的程序集中重用类型。
这是我用来在客户端上测试的代码:
MyObject record = new MyObject();
record.Name = "This is Me";
record.TestInt = 5;
int? returnValue = _client.GetMyTestInt(record);
string message;
if (returnValue == null)
message = "Integer value is null.";
else
message = "Integer value is " + returnValue.ToString();
MessageBox.Show(message, _client.GetMyName(record));
上面的代码显示了一条消息,表明我的服务返回的整数是null,而不是我分配给它的5。但是,GetMyName会为我的字符串返回正确的值,该值显示为我的消息框的标题。
为什么服务似乎正在接收空值?
答案 0 :(得分:2)
您必须将[DataMember]属性添加到支持字段。
像这样更改合同:
[DataContract]
public class MyObject
{
[DataMember] // data contract on backing field
private string _Name;
public string Name
{
get { return _Name; }
set { _Name = value; }
}
[DataMember] // data contract on backing field
private int? _TestInt;
public int? TestInt
{
get { return _TestInt; }
set { _TestInt = value; }
}
public MyObject()
{
_Name = "";
_TestInt = 0;
}
}
答案 1 :(得分:1)
在DataContract中将Property属性添加为
[DataMember(IsRequired = true)]