【dinghao】delphi對.net2.0webservice封裝問題

iDotNetSpace發表於2008-06-05
 delphi呼叫WebService一直髮生500錯誤,可是同樣的Service用.net呼叫,xmlspy呼叫都沒有問題。因此估計Delphi對Service的封裝有問題。
    跟蹤發現:竟然沒有引數傳遞給Webservice,引數或者是null或者是初始值。通過檢視Post的資料包:
 
【dinghao】delphi對.net2.0webservice封裝問題              xml version="1.0"?>
【dinghao】delphi對.net2.0webservice封裝問題              
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xm
【dinghao】delphi對.net2.0webservice封裝問題              lns:xsd
="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XML
【dinghao】delphi對.net2.0webservice封裝問題              Schema-instance"
 xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
【dinghao】delphi對.net2.0webservice封裝問題                
<SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encodin
【dinghao】delphi對.net2.0webservice封裝問題              g/"
 xmlns:NS2="http://microsoft.com/wsdl/types/">
【dinghao】delphi對.net2.0webservice封裝問題                  
<NS1:GetServiceInfo xmlns:NS1="http://goldentek.biz/">
【dinghao】delphi對.net2.0webservice封裝問題                    
<passport xsi:type="xsd:string">xxx@im.chinabubble.compassport>
【dinghao】delphi對.net2.0webservice封裝問題                    
<oem xsi:type="NS2:guid">{xxxxxxxx-8456-550a-8bb9-65d484f8bc3b}oem>
【dinghao】delphi對.net2.0webservice封裝問題                    
<codePage xsi:type="xsd:int">936codePage>
【dinghao】delphi對.net2.0webservice封裝問題                  
NS1:GetServiceInfo>
【dinghao】delphi對.net2.0webservice封裝問題                
SOAP-ENV:Body>
【dinghao】delphi對.net2.0webservice封裝問題              
SOAP-ENV:Envelope>
【dinghao】delphi對.net2.0webservice封裝問題
發現以下部分不正確:
【dinghao】delphi對.net2.0webservice封裝問題                  <NS1:GetServiceInfo xmlns:NS1="http://goldentek.biz/">
【dinghao】delphi對.net2.0webservice封裝問題                    
<passport xsi:type="xsd:string">monkeyking@im.chinabubble.compassport>
【dinghao】delphi對.net2.0webservice封裝問題                    
<oem xsi:type="NS2:guid">{341a4fbb-8456-550a-8bb9-65d484f8bc3b}oem>
【dinghao】delphi對.net2.0webservice封裝問題                    
<codePage xsi:type="xsd:int">936codePage>
【dinghao】delphi對.net2.0webservice封裝問題                  
NS1:GetServiceInfo>
【dinghao】delphi對.net2.0webservice封裝問題
    問題已經確定是Delphi的封裝問題。進一步測試發現,在2005下的Service,如果有引數delphi都不能正確封裝。難道只有把服務轉到2003?或者自己封裝Webservie呼叫?這兩個方法都要很多工作量。
    下面先看一下2003和2005生成的wsdl的不同點(完整wsdl看附錄):
    1、2005增加了對soap1.2的支援
    2、2005如果沒有描述會沒有<documentation xmlns="http://schemas.xmlsoap.org/wsdl/" /> 標記。
    3、2005沒有顯式設定styly,而採用的是預設值 <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" /> 
    第二個可以排除,它不會產生這樣的錯誤,最有可能的是第一條,delphi對soap1.2支援不好。而且發現:“User-Agent: Borland SOAP 1.2”,證明delphi確實用的是Soap1.2。手動修改Wsdl,去掉對1.2的支援重新生成代理類,測試扔出現問題。
    是第三個?可是省略style也是符合wsdl規範的。修改wsdl加上style,測試成功。真是沒有想到會是這裡的問題,修改起來竟是如此簡單!
    後面還發現delphi不能正確解析nil如:,這樣在.net中就不能用nullable值了,如:int?   
總結:
    可以看出delphi對webservie的封裝還是很有問題的,規範都沒有實現!對xml的支援也不完善。
    因此在webservice的開發中不要用高階的特性,因為某些語言對service的封裝還是不好。
    還真是懷疑wse的前途,還是因為某些語言呼叫起來很麻煩。
   
 附:
正確的Post格式
1、
【dinghao】delphi對.net2.0webservice封裝問題              xml version="1.0"?>
【dinghao】delphi對.net2.0webservice封裝問題              
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xm
【dinghao】delphi對.net2.0webservice封裝問題              lns:xsd
="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XML
【dinghao】delphi對.net2.0webservice封裝問題              Schema-instance"
>
【dinghao】delphi對.net2.0webservice封裝問題                
<SOAP-ENV:Body>
【dinghao】delphi對.net2.0webservice封裝問題                  
<GetServiceInfo xmlns="http://goldentek.biz/">
【dinghao】delphi對.net2.0webservice封裝問題                    
<passport>xxxxx@im.chinabubble.compassport>
【dinghao】delphi對.net2.0webservice封裝問題                    
<oem>{xxxxxxxx-8456-550a-8bb9-65d484f8bc3b}oem>
【dinghao】delphi對.net2.0webservice封裝問題                    
<codePage>936codePage>
【dinghao】delphi對.net2.0webservice封裝問題                  
GetServiceInfo>
【dinghao】delphi對.net2.0webservice封裝問題                
SOAP-ENV:Body>
【dinghao】delphi對.net2.0webservice封裝問題              
SOAP-ENV:Envelope>
【dinghao】delphi對.net2.0webservice封裝問題
2、
【dinghao】delphi對.net2.0webservice封裝問題<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
【dinghao】delphi對.net2.0webservice封裝問題    
<SOAP-ENV:Body>
【dinghao】delphi對.net2.0webservice封裝問題        
<m:GetServiceInfo xmlns:m="http://goldentek.biz/">
【dinghao】delphi對.net2.0webservice封裝問題            
<m:passport>monkeyking@im.chinabubble.comm:passport>
【dinghao】delphi對.net2.0webservice封裝問題            
<m:oem>341a4fbb-8456-550a-8bb9-65d484f8bc3bm:oem>
【dinghao】delphi對.net2.0webservice封裝問題            
<m:codePage>936m:codePage>
【dinghao】delphi對.net2.0webservice封裝問題        
m:GetServiceInfo>
【dinghao】delphi對.net2.0webservice封裝問題    
SOAP-ENV:Body>
【dinghao】delphi對.net2.0webservice封裝問題
SOAP-ENV:Envelope>

wsdl規範:
http://www.w3.org/TR/2004/WD-wsdl20-primer-20041221/

下面是1.1和2.0的wsdl,webmethod是:

【dinghao】delphi對.net2.0webservice封裝問題



.net1.1生成的wsdl:

【dinghao】delphi對.net2.0webservice封裝問題


.net2.0生成的wsdl:

【dinghao】delphi對.net2.0webservice封裝問題

相關文章