【问题标题】:svcutil.exe - Proxy generated not allowing for nullable fieldssvcutil.exe - 生成的代理不允许为空字段
【发布时间】:2010-11-03 20:07:52
【问题描述】:

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

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

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

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

(顺便说一句,我通过研究注意到其他人能够使用“添加服务引用”功能正确生成这些额外的“指定”字段,但无论出于何种原因,Visual Studio 似乎都不想生成添加引用后的代理(之后没有任何反应))

WSDL File Generated Proxy

使用的命令: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

【问题讨论】:

标签: .net wcf wsdl nullable svcutil.exe


【解决方案1】:

我猜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>

马克

【讨论】:

  • 那些指定的字段没有显示出来,但是你对 nillable 是正确的......如果我将它添加到 WSDL,那么 svcutil 确实会为调用正确生成可为空的参数。谢谢
  • 我有一个元素是可选的 (minOccurs="0") 并且故意不可为空的情况。我也没有得到“指定”字段......除非我包含“/serializer:XmlSerializer”命令行选项。我猜默认的 DataContractSerializer 不能正确处理这种情况......?让 DataContractSerializer 代码工作的唯一方法是,如果您手动修改生成的代码以在 DataMemberAttribute 中指定 EmitDefaultValue="false",但是您将永远无法发送零,因为这将被解释为不存在服务器的值。
【解决方案2】:

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

【讨论】:

  • 我希望使用 svcutil 的主要原因是为了节省时间。我不确定我是否能够足够快地手动实现所有内容。
  • (几年后)你有这个方法的链接吗?
  • 什么方法? (断章取义,几年后)
  • 我认为 Steve B 的意思是使用 ChannelFactory 解决的方法
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2013-08-21
    • 2012-08-24
    • 1970-01-01
    • 2011-08-17
    • 2015-10-04
    • 2020-02-07
    • 2013-08-22
    • 2010-12-14
    • 1970-01-01
    相关资源
    最近更新 更多