【问题标题】:WCF Service Receiving Null Values from DataContractWCF 服务从 DataContract 接收空值
【发布时间】:2014-02-12 19:27:28
【问题描述】:

我的团队正在开发 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));

上面的代码显示了一条消息,表明我的服务返回的整数为空,而不是我分配给它的 5。但是,GetMyName 确实为我的字符串返回了正确的值,它显示为我的消息框的标题。

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

【问题讨论】:

  • 您找到解决问题的方法了吗?
  • 是的。将 [OperationBehavior] 更改为 [OperationBehavior(Impersonation = ImpersonationOption.Required)] 似乎可以正常工作。

标签: c# wcf service null datacontract


【解决方案1】:

您必须将 [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;
    }
}

【讨论】:

  • 支持字段?你指的是哪条线?
  • 感谢您的澄清。进行更改后,我看到客户端现在可以访问 _Name 和 _TestInt,即使它们是私有的。但是,Int 值仍然返回 null。
  • 使用 DataContract 属性装饰私有字段不会使它们可见。你是如何产生你的客户的?您使用的是 MEX 端点,您使用的是 ClientBase 还是其他东西?
【解决方案2】:

在DataContract中添加Property属性为

[DataMember(IsRequired = true)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多