2009-06-17 89 views
6

我想通過使用svcutil.exe創建WCF代理來使用WSDL指定的Web服務,但WSDL指定某些操作的參數是可選的的minOccurs =「0」),例如:svcutil.exe - 代理生成不允許爲空字段

<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 /內部/n:*,Elluminate.WebService.WebServiceProxy /o:WebServiceProxy.cs /配置:App.config/nologo

+0

SvcUtil通常是一個PITA,我不使用它,但我的服務和WCF,所以我有更容易的任務。 – 2009-06-18 14:16:11

+0

指定的屬性沒有生成是非常奇怪的......這是WCF處理選項值類型的方法。沒有svcutil提供的錯誤?如果不是,你可以向我們提供WSDL文件和生成的內容嗎? – Philippe 2009-06-18 15:17:28

+0

當然,WSDL可在: http://sas-int.elluminate.com/site/external/adapter/default/v1/webservice.wsdl 我正在使用以下命令來生成代理: SvcUtil工具http://sas-int.elluminate.com/site/external/adapter/default/v1/webservice.wsdl /內部/n:*,Elluminate.WebService.WebServiceProxy /o:WebServiceProxy.cs /配置:. \ App.config中/ NOLOGO 這裏是會產生什麼: http://pastebin.com/m20688d39 謝謝! – David 2009-06-18 17:09:32

回答

6

我猜想由svcutil生成的客戶端代理類有類型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> 

馬克

1

如果SVCUtil不適用於您,請勿使用SVCUtil。 如果服務不是很複雜,您可以嘗試手動編寫服務接口,並使用ChannelFactory>創建代理。

0

這是一個問題,因爲的minOccurs =「0」應該讓你不發出'meetingId'值,並且生成的代理不允許它。

您只會使用該服務,因此您無法控制wsdl,並且無法在wsdl中添加nillable =「true」,以便在代理中使'meetingId'可選。

如果您使用wsdl.exe而不是svcutil.exe生成代理,那麼您將擁有允許您選擇是否發出字段meetingId的附加字段'meetingIdSpecified'。

wsdl.exe http:///myservice?wsdl 

但隨着Wsdl.exe用你將消耗與asp.net web服務,而不是WCF服務。

我認爲缺少的字段是svcutil.exe的一個bug(對我來說4.0.30319.17929),因爲如果你使用選項/包產生:

svcutil.exe /wrapped http:///myservice?wsdl 

..then你也將有現場'meetingIdSpecified'生成!

相關問題