我已经为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引用确实产生了“指定的”属性,这使我可以跳过发送可选元素,一切都很好。
有任何想法吗?我想使用服务引用来保持我们在使用服务的库中保持一致。
我等一下,看看是否有人有更聪明的答案,但是我在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服务。所以我不希望更新服务引用(因此搞砸了)。
另一种解决方案可以在这里找到:Binding to a SOAP Service With Optional Value Types
(在生成的Reference.svcmap文件中将<Wrapped>true</Wrapped>
添加到元素ClientOptions
)