.net svcutil.exe-生成的代理不允许为空字段

.net svcutil.exe-生成的代理不允许为空字段,.net,wcf,wsdl,nullable,svcutil.exe,.net,Wcf,Wsdl,Nullable,Svcutil.exe,我试图通过使用svcutil.exe创建WCF代理来使用使用WSDL指定的web服务,但WSDL指定某些操作具有可选参数(minOccurs=“0”),例如: <xs:element minOccurs="0" maxOccurs="1" name="meetingId" type="xs:int" /> 不幸的是,生成的代理不允许我不指定值(参数不可为null),并且没有“指定”字段作为指示代理不应发送值的调用的一部分 有没有办法使用svcutil生成一个代理,让我可以这样

我试图通过使用svcutil.exe创建WCF代理来使用使用WSDL指定的web服务,但WSDL指定某些操作具有可选参数(minOccurs=“0”),例如:

<xs:element minOccurs="0" maxOccurs="1" name="meetingId" type="xs:int" /> 

不幸的是,生成的代理不允许我不指定值(参数不可为null),并且没有“指定”字段作为指示代理不应发送值的调用的一部分

有没有办法使用svcutil生成一个代理,让我可以这样做

(另一方面,我通过研究发现,其他人能够使用“添加服务引用”功能正确地生成这些额外的“指定”字段,但无论出于何种原因,Visual Studio似乎不希望在我添加引用后生成代理(之后不会发生任何事情))


使用的命令:svcutil/internal/n:*,Elluminate.WebService.WebServiceProxy/o:WebServiceProxy.cs/config:App.config/nologo如果svcutil不适用于您,请不要使用它。
如果服务不是很复杂,您可以尝试手动编写服务接口,并使用ChannelFactory创建代理。

我猜由
svcuti
生成的客户端代理类有一个名为
meetingId
int
类型的字段/属性,对吗?是的,这是不可为空的-但我敢打赌您也有一个名为
meetingIdSpecified
的布尔字段/属性-只有当该字段设置为
true
时,服务才会实际查看它;如果您不设置它,那么服务将不会查看该值,因此它几乎就像它在where
NULL
中一样

另外,您也没有在XSD中指定可为null的字段,而是将其指定为可选字段。要使其为空,请在此处使用以下语法:

<xs:element minOccurs="0" maxOccurs="1" name="meetingId" type="xs:int" 
            nillable="true" />

请参见“可为空”属性?这是一个用于使字段真正可为空的项-现在您可以在XML中有这样一个条目:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <meetingId xsi:nil="true" />
</root>


Marc

这是一个问题,因为minOccurs=“0”应允许您不发出“meetingId”值,而生成的代理不允许发出该值

您只使用服务,因此无法控制wsdl,也无法在wsdl中添加nillable=“true”,以便在代理中选择“meetingId”

如果您使用wsdl.exe而不是svcutil.exe生成代理,那么您将拥有额外的字段“meetingIdSpecified”,该字段允许您选择是否发出字段meetingId

wsdl.exe http:///myservice?wsdl
但是使用wsdl.exe,您将使用asp.net web服务而不是WCF来使用您的服务

我认为缺少的字段是svcutil.exe(对于我来说是4.0.30319.17929)中的一个错误,因为如果使用选项/wrapped生成:

svcutil.exe /wrapped http:///myservice?wsdl

…然后还将生成“meetingIdSpecified”字段

SvcUtil通常是一个PITA,我不使用它,但是我的服务和WCF让我的任务简单得多。。。这是处理可选值类型的WCF方法。svcutil没有提供错误?如果没有,您能否向我们提供WSDL文件以及生成的内容?当然,WSDL可以在以下位置获得:我正在使用以下命令生成代理:svcutil/internal/n:*,Elluminate.WebService.WebServiceProxy/o:WebServiceProxy.cs/config:..\App.config/nologo,下面是生成的内容:谢谢!不过,我希望使用svcutil的主要原因是为了节省时间。我不确定我是否能够足够快地手动实现所有东西。(几年后)你有这个方法的链接吗?什么方法?(断章取义,几年后)我认为Steve B的意思是用ChannelFactory解决问题的方法那些指定的字段没有出现,但关于nillable的问题你是对的。。。如果我将其添加到WSDL中,那么svcutil会正确地为调用生成可为null的参数。在这种情况下,元素是可选的(minOccurs=“0”),并且故意不可为零。我也没有得到“指定”字段。。。除非我包含“/serializer:XmlSerializer”命令行选项。我猜默认的DataContractSerializer无法正确处理这种情况。。。?让DataContractSerializer代码正常工作的唯一方法是手动修改生成的代码以在DataMemberAttribute中指定EmitDefaultValue=“false”,但是您永远无法发送零,因为服务器会将其解释为缺少值。