我试图通过使用 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
最佳答案
我猜 svcutil
生成的客户端代理类有一个名为 meetingId
的字段/属性类型 int
- 对?是的,这是不可为空的 - 但我敢打赌你也有一个名为 meetingIdSpecified
的 bool 字段/属性- 仅当设置为 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>
马克
关于.net - svcutil.exe - 生成的代理不允许为空字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1009895/