我试图通过使用svcutil.exe创建WCF代理来使用使用WSDL指定的Web服务,但是WSDL指定某些操作具有可选的参数(minOccurs =“0”),例如:< / p>
<xs:element minOccurs="0" maxOccurs="1" name="meetingId" type="xs:int" />
不幸的是,生成的代理不允许我不指定值(参数不可为空),并且没有“指定”字段作为调用的一部分,指示代理不应发送任何值。 / p>
有没有办法使用svcutil来生成允许我这样做的代理?
(旁注,我通过研究发现其他人能够使用“添加服务引用”功能正确生成这些额外的“指定”字段,但无论出于何种原因,Visual Studio似乎都不想生成添加引用之后的代理(之后没有任何事情发生))
使用的命令:svcutil http://sas-int.elluminate.com/site/external/adapter/default/v1/webservice.wsdl / internal /n:*,Elluminate.WebService.WebServiceProxy /o:WebServiceProxy.cs /config:App.config / nologo
答案 0 :(得分:6)
我猜测svcutil
生成的客户端代理类有meetingId
类型int
的字段/属性 - 对吧?是的,这是不可空的 - 但我敢打赌你也有一个名为meetingIdSpecified
的布尔字段/属性 - 只有当它被设置为true
时,服务才真正看到它;如果你没有设置它,那么服务将不会查看该值,因此它几乎就像NULL
那样。
此外 - 您没有在XSD中指定可以为空的字段 - 您将其指定为可选字段。要使其可为空,请在此处使用以下语法:
<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>
马克
答案 1 :(得分:1)
如果它不适合您,请不要使用SVCUtil。 如果服务不是很复杂,您可以尝试手动编写服务接口,并使用ChannelFactory&lt;&gt;创建代理。
答案 2 :(得分:1)
这是一个问题,因为minOccurs =&#34; 0&#34;应该让你不要发出会议纪录。值,并且生成的代理不允许它。
您只使用该服务,因此您无法控制wsdl,也无法添加nillable =&#34; true&#34;在wsdl中,以便有一个&#39; meetingId&#39;在您的代理中可选。
如果使用wsdl.exe而不是svcutil.exe生成代理,则会有其他字段&#39; meetingIdSpecified&#39;允许您选择是否发出字段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
..那么你也会有这个领域&#39; meetingIdSpecified&#39;生成了!