C#WS客户端避免空值序列化
我对通过“添加新服务引用”选项自动创建的SOAP webclient有问题。 服务是从JAVA-CXF生成的,在我的代理类中,它具有如下签名:C#WS客户端避免空值序列化,c#,web-services,soap,cxf,C#,Web Services,Soap,Cxf,我对通过“添加新服务引用”选项自动创建的SOAP webclient有问题。 服务是从JAVA-CXF生成的,在我的代理类中,它具有如下签名: public generatedClassResponse search (string p1, long p2); p2参数是可选的,所以我需要修改我的类。我把字体改成了long?现在,我从服务接收到一个错误:序列化“”值时出现解组错误 我的请求自动生成的类是: public class searchRequest {
public generatedClassResponse search (string p1, long p2);
p2参数是可选的,所以我需要修改我的类。我把字体改成了long?现在,我从服务接收到一个错误:序列化“”值时出现解组错误
我的请求自动生成的类是:
public class searchRequest {
//omitted non param const
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
[System.ServiceModel.MessageContractAttribute(WrapperName="searchEvents", WrapperNamespace="http://test.com/", IsWrapped=true)]
public searchRequest (string p1, long? p2) { //p2 type modified
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://test.com/", Order=0)]
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string P1
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://test.com/", Order=1)]
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public long2? P2
}
}
通过调试,我可以看到我的SOAP xml请求是(省略SOAP标记):
废话
所以,服务器正在接收该元素的“”值,但我想从请求XML中删除该元素
我还有一个类搜索,它包含在我的接口代理类的knowntypes中,但对它的修改没有效果(显然)
编辑:
该类同时具有私有long P2属性和私有bool P2指定属性,但我的代理类没有将搜索类作为参数传递的方法,而只有一个具有searchRequest类param的方法
我在我的类中测试了ShouldSerializeP2(),在这两个类中都测试了P2指定的属性,但我无法避免生成P2标记
有什么想法吗?
非常感谢。通常,当您生成具有不可为空的C#类型的可选字段(如“long”)的代理时,代理生成器会生成一个附加的布尔值,该布尔值的字段名后缀为“IsSpecified”。在您的情况下,这将是“P2IsSpecified”。如果没有,那么检查WSDL以确保该字段确实是可选的。事实上,该字段是可选的。正如我所编辑的,还有第二个类,它具有P2IsSpecified属性,但我无法向该类传递参数。我如何使用它呢?为什么有两个Order=0的属性?可能是这导致了错误。对不起,是打字错误。顺序值为0和1。
<search>
<P1>blah</P1>
<P2 xsi:nill="true"></P2>
</search>