• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

delphi对.net2.0webservice封装问题

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
    delphi调用WebService一直发生500错误,可是同样的Service用.net调用,xmlspy调用都没有问题。因此估计Delphi对Service的封装有问题。
    跟踪发现:竟然没有参数传递给Webservice,参数或者是null或者是初始值。通过查看Post的数据包:
 
              <?xml version="1.0"?>
              
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xm
              lns:xsd
="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XML
              Schema-instance"
 xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
                
<SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encodin
              g/"
 xmlns:NS2="http://microsoft.com/wsdl/types/">
                  
<NS1:GetServiceInfo xmlns:NS1="http://goldentek.biz/">
                    
<passport xsi:type="xsd:string">[email protected]</passport>
                    
<oem xsi:type="NS2:guid">{xxxxxxxx-8456-550a-8bb9-65d484f8bc3b}</oem>
                    
<codePage xsi:type="xsd:int">936</codePage>
                  
</NS1:GetServiceInfo>
                
</SOAP-ENV:Body>
              
</SOAP-ENV:Envelope>
发现以下部分不正确:
                  <NS1:GetServiceInfo xmlns:NS1="http://goldentek.biz/">
                    
<passport xsi:type="xsd:string">[email protected]</passport>
                    
<oem xsi:type="NS2:guid">{341a4fbb-8456-550a-8bb9-65d484f8bc3b}</oem>
                    
<codePage xsi:type="xsd:int">936</codePage>
                  
</NS1:GetServiceInfo>
    问题已经确定是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如:<ErrCode xsi:nil="true"/>,这样在.net中就不能用nullable值了,如:int?   
总结:
    可以看出delphi对webservie的封装还是很有问题的,规范都没有实现!对xml的支持也不完善。
    因此在webservice的开发中不要用高级的特性,因为某些语言对service的封装还是不好。
    还真是怀疑wse的前途,还是因为某些语言调用起来很麻烦。
   
 附:
正确的Post格式
1、
              <?xml version="1.0"?>
              
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xm
              lns:xsd
="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XML
              Schema-instance"
>
                
<SOAP-ENV:Body>
                  
<GetServiceInfo xmlns="http://goldentek.biz/">
                    
<passport>[email protected]</passport>
                    
<oem>{xxxxxxxx-8456-550a-8bb9-65d484f8bc3b}</oem>
                    
<codePage>936</codePage>
                  
</GetServiceInfo>
                
</SOAP-ENV:Body>
              
</SOAP-ENV:Envelope>
2、
<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">
    
<SOAP-ENV:Body>
        
<m:GetServiceInfo xmlns:m="http://goldentek.biz/">
            
<m:passport>[email protected]</m:passport>
            
<m:oem>341a4fbb-8456-550a-8bb9-65d484f8bc3b</m:oem>
            
<m:codePage>936</m:codePage>
        
</m:GetServiceInfo>
    
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

wsdl规范:
http://www.w3.org/TR/2004/WD-wsdl20-primer-20041221/

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

    }



.net1.1生成的wsdl:

>


.net2.0生成的wsdl:

>

    感谢 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Delphi的保存文件对话框-TsaveDialog发布时间:2022-07-18
下一篇:
Delphi收藏发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap