Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#.Net如何确定是否提供了可为null的DataMember值_C#_Soap_Datacontract_Optional_Datamember - Fatal编程技术网

C#.Net如何确定是否提供了可为null的DataMember值

C#.Net如何确定是否提供了可为null的DataMember值,c#,soap,datacontract,optional,datamember,C#,Soap,Datacontract,Optional,Datamember,我正在实现一个WCF/Soap服务操作,并且已经将数据契约的几个成员定义为非必需的(IsRequired=false) 我的问题涉及以下两种情况 客户机为合同元素提供空值(i:nil=“true”) 客户不提供可选元素(即,他们向我发送部分合同) 这个问题对于复杂和可为空的基元类型都很重要。据我所知,.Net序列化程序在两种情况下都返回null,因此我的问题是,有人能推荐一种方法来确定SOAP请求中是否提供了可选参数吗?一种解决方法是在数据协定中添加boolean MemberSupplie

我正在实现一个WCF/Soap服务操作,并且已经将数据契约的几个成员定义为非必需的(
IsRequired=false

我的问题涉及以下两种情况

  • 客户机为合同元素提供空值(i:nil=“true”)
  • 客户不提供可选元素(即,他们向我发送部分合同)

这个问题对于复杂和可为空的基元类型都很重要。据我所知,.Net序列化程序在两种情况下都返回
null
,因此我的问题是,有人能推荐一种方法来确定SOAP请求中是否提供了可选参数吗?

一种解决方法是在数据协定中添加boolean MemberSupplied类型成员。例如:

[DataContract]
public class EmployeeSearchParams
{
    [DataMember]
    public Employee Manager {get; set;}

    [DataMember]
    public bool ManagerSupplied {get; set;}
}

感谢您的解决方案,我已经在另一个与不同问题相关的线程上看到了这一建议。如果有必要,我可以使用这种方法,但如果可能的话,我宁愿避免它,因为它有点笨重。如果可以避免的话,我不愿意改变合同来解决这个问题。昨天与一位同事交谈时,Java提供了一个更清晰的解决方案,解决了这个问题:序列化程序提供反序列化对象以及原始请求的包装器,该包装器提供属性以确定是否提供了可选元素。@Jonna这也是我对这种方法的最初感觉,但尽管我称之为一种解决方法,我还是接受了这一更干净的解决方案。在我看来,在服务器端处理原始SOAP变得更加复杂。也考虑客户端。如果它是一个直接的WCF客户端,客户端将无法选择是发送null还是逐个调用地忽略成员。