WCF服务从DataContract接收空值

时间:2014-02-12 19:27:29

标签: c# wcf service null datacontract

我的团队正在开发一个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会为我的字符串返回正确的值,该值显示为我的消息框的标题。

为什么服务似乎正在接收空值?

2 个答案:

答案 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)]