7

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

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

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

有什么方法可以使用 svcutil 生成允许我这样做的代理?

(附带说明一下,通过我的研究,我注意到其他人能够使用“添加服务引用”功能正确生成这些额外的“指定”字段,但无论出于何种原因,Visual Studio 似乎都不想在之后生成代理我添加了参考(之后什么都没有发生))

WSDL 文件 生成的代理

使用的命令:svcutil http://sas-int.elluminate.com/site/external/adapter/default/v1/webservice.wsdl /internal /n:*,Elluminate.WebService.WebServiceProxy /o:WebServiceProxy.cs /config:应用程序.config /nologo

4

3 回答 3

8

我猜想生成的客户端代理类svcutil有一个名为meetingIdtype的字段/属性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>

马克

于 2009-06-19T16:47:19.883 回答
1

如果它不适合您,请不要使用 SVCUtil。如果服务不是很复杂,您可以尝试手动编写服务接口,并使用 ChannelFactory<> 来创建您的代理。

于 2009-06-18T14:15:32.580 回答
1

这是一个问题,因为 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”字段!

于 2016-02-05T10:41:18.560 回答