我为SOAP Web服务添加了服务参考。 WSDL包含一些dateTime元素,如:
<xsd:element minOccurs="0" name="plannedStartDate" type="xsd:dateTime"/>
<xsd:element minOccurs="0" name="plannedEndDate" type="xsd:dateTime"/>
等。 VS2013生成了一个具有(非可空)DateTime类型属性的类,但没有添加像plannedStartDateSpecified这样的属性。因此,我没有选择跳过发送其中任何一个。如果我将生成的代码破解为可以为空的DateTime?属性,它在这些字段中发送null,远程系统将值视为我所期望的。我需要完全跳过发送输入元素。
创建Web引用确实产生了“指定的”属性,这使我可以跳过发送可选元素,一切都很好。
有什么想法吗?我想使用服务引用来保持所有使用服务的库之间的一致性。
答案 0 :(得分:3)
我等等,看看是否有人有更聪明的答案,但是我在Smlcuerializer上使用了svcutil.exe,并将其包装,如下所示。
svcutil /serializer:XmlSerializer /namespace:*,<desired_namespace_for_generated_class> /wrapped <path_to_WSDL>
为了方便app.config,我在Visual Studio中为常规服务引用添加了相同的WSDL,然后将VS生成的Reference.cs的内容替换为从svcutil.exe生成的文件的内容。现在我有*指定的字段,一切都像我想要的那样。
是的,编辑生成的代码并不太合适,但这是一个已发布的版本化Web服务。所以我不希望更新服务参考(因此搞砸了)。
答案 1 :(得分:0)
可以在此处找到另一种解决方案:Binding to a SOAP Service With Optional Value Types
(将<Wrapped>true</Wrapped>
添加到生成的Reference.svcmap文件中的元素ClientOptions
中)