2012-03-03 231 views
1

this link中獲取tripservice wsdl在此wsdl中,我將下面的元素替換爲(添加nillable爲true並添加了最小長度和最大長度限制)。vb.net soap客戶端請求生成

<xs:element minOccurs="0" name="from" nillable="true"> 
      <xs:simpleType> 
       <xs:restriction base="xs:string"> 
       <xs:minLength value="1"/> 
       <xs:maxLength value="12"/> 
       </xs:restriction> 
      </xs:simpleType> 
      </xs:element> 

現在在我的vb.net客戶我通過添加服務引用,WSDL保存到本地文件夾調用的服務。

Dim objproxy As New Tripservice.TripPriceServiceFacadeClient 
     Dim gh As New Tripservice.trip 
     gh.adults = 9 
     gh.duration = 8 
     gh.rooms = 8 
     gh.to = "p" 
     objproxy.getTripPrice(gh) 

它會拋出結束點沒有發現異常,但是我對請求xml感興趣。我啓用了跟蹤,發現下面的請求已生成。

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
     <getTripPrice xmlns="http://trip.price.service"> 
     <trip xmlns=""> 
      <adults>9</adults> 
      <duration>8</duration> 
      <from xsi:nil="true"/> 
      <rooms>8</rooms> 
      <to>p</to> 
     </trip> 
     </getTripPrice> 
    </s:Body> 
</s:Envelope> 

從的xsi的元件:無=「真」被生成,即使我沒有接觸元件在我vb.net代碼來生成所述請求。根據wsdl(min occurrence = 0),元素是可選的。我如何發送請求而不使用來自元素名稱的請求?

回答

1

你不能;找出你爲什麼改變它爲什麼是有用的是很有趣的;在這種情況下,.NET代碼生成工作的方式,你無法知道它是否應該編碼標籤;通常情況下,一個可選的null字符串不會被編組。可選的(minOccurs = 0)和nillable將不起作用,因爲沒有「set」指示符(JAXB有它或用來擁有它)跟蹤用戶代碼是否設置null值或非null值。

+0

在接受請求xml的Web服務中,根據標記是否存在以及它是否爲nillable = true來執行一些處理。然而,如果不改變,請求總是伴隨着這種行爲。 – Suresh 2012-03-03 16:41:30

+0

@Suresh,我發現合同中的一個奇怪的事情是,一次旅行的價格可能不包括*,*和a *到*。因爲這些是可選的(?!),服務的文檔應該告訴你,如果其中一個或另一個或兩者缺失,行爲應該是什麼。我會聯繫服務所有者。還有一條建議:在任何情況下,合同的修改方式都不應該與原來的一致(引進的可能是兼容的,但不是一致的);有時需要XML Schema重構來適應工具,但在你的情況下,我不明白爲什麼你會擺弄它... – 2012-03-03 18:34:24