一个.NET调用PHP Web Service的典型例子
创始人
2024-04-27 03:51:50
0次

最近一个项目由"WinForm直接访问DB2"移植到"WinForm通过PHP Web Service来访问DB2”。

这个命题的难点不是访问DB2,而是.NET调用PHP Web Service。对于我这个长期作.NET,之前一直以为只有通过.NET调用PHP Web Service……的人来说,真是有点强“聪”所难了。

但是问题还是要解决的,期限就摆在眼前呢。经过一番调查,终于有了眉目,现在分享给大家。

首先要说明的,PHP服务器需要至少需要两个文件——一个WSDL文件和一个PHP文件。WSDL文件是一种机读的XML文件,用于描述WebService提供的服务和调用方法(对于.NET则可以自动生成调用代码,十分好用),php文件就是真正实现的WEB服务了。

1)PHP服务器端代码

1-1)TestWebService.php代码

  1. TestWebService.php  
  2. class TestWebService  
  3. {  
  4.     public function HelloWorld()  
  5.     {  
  6.         return array("HelloWorldResult"=>"Hello");  
  7.     }  
  8.  
  9.     public function GetArray($args)  
  10.         {  
  11.           /*  
  12.            注意,Web Service的方法在声明时至多一个参数,  
  13.             可是在调用该方法时就必须传value1,value2两个参数。  
  14.             (这一点十分令人费解,我的理解是,在调用该方法时,系统把所有参数都放到一个对象里传过来的)  
  15.           */ 
  16.  
  17.         $value1 = $args->value1;    
  18.         $value2 = $args->value2;//这两句是获取真正的参数  
  19.    
  20.         $arry = array($value1,$value2);  
  21.  
  22.         //返回值也很特别,不是直接返回$arry,而是把它放到一个对象里再返回。  
  23.         return array("GetArrayResult"=>$arry);  
  24.     }  
  25. }  
  26. //创建WebSevice实例  
  27. $server = new SoapServer("TestWebService.wsdl");  
  28. //指定类名  
  29. $server->setClass("TestWebService");  
  30. $server->handle();  
  31. ?> 

1-2)TestWebService.wsdl代码

  1. TestWebService.wsdl  
  2.  version="1.0" encoding="utf-8"?> 
  3.  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> 
  4.    
  5.      elementFormDefault="qualified" targetNamespace="http://tempuri.org/"> 
  6.        name="HelloWorld"> 
  7.          /> 
  8.        
  9.        name="HelloWorldResponse"> 
  10.          
  11.            
  12.              minOccurs="0" maxOccurs="1" name="HelloWorldResult" type="s:string" /> 
  13.            
  14.          
  15.        
  16.        name="GetArray"> 
  17.          
  18.            
  19.              minOccurs="0" maxOccurs="1" name="value1" type="s:string" /> 
  20.              minOccurs="0" maxOccurs="1" name="value2" type="s:string" /> 
  21.            
  22.          
  23.        
  24.        name="GetArrayResponse"> 
  25.          
  26.            
  27.              minOccurs="0" maxOccurs="1" name="GetArrayResult" type="tns:ArrayOfString" /> 
  28.            
  29.          
  30.        
  31.        name="ArrayOfString"> 
  32.          
  33.            minOccurs="0" maxOccurs="unbounded" name="string" nillable="true" type="s:string" /> 
  34.          
  35.        
  36.      
  37.    
  38.    name="HelloWorldSoapIn"> 
  39.      name="parameters" element="tns:HelloWorld" /> 
  40.    
  41.    name="HelloWorldSoapOut"> 
  42.      name="parameters" element="tns:HelloWorldResponse" /> 
  43.    
  44.    name="GetArraySoapIn"> 
  45.      name="parameters" element="tns:GetArray" /> 
  46.    
  47.    name="GetArraySoapOut"> 
  48.      name="parameters" element="tns:GetArrayResponse" /> 
  49.    
  50.    name="TestWebServiceSoap"> 
  51.      name="HelloWorld"> 
  52.        message="tns:HelloWorldSoapIn" /> 
  53.        message="tns:HelloWorldSoapOut" /> 
  54.      
  55.      name="GetArray"> 
  56.        message="tns:GetArraySoapIn" /> 
  57.        message="tns:GetArraySoapOut" /> 
  58.      
  59.    
  60.    name="TestWebServiceSoap" type="tns:TestWebServiceSoap"> 
  61.      transport="http://schemas.xmlsoap.org/soap/http" /> 
  62.      name="HelloWorld"> 
  63.        soapAction="http://tempuri.org/HelloWorld" style="document" /> 
  64.        
  65.          use="literal" /> 
  66.        
  67.        
  68.          use="literal" /> 
  69.        
  70.      
  71.      name="GetArray"> 
  72.        soapAction="http://tempuri.org/GetArray" style="document" /> 
  73.        
  74.          use="literal" /> 
  75.        
  76.        
  77.          use="literal" /> 
  78.        
  79.      
  80.    
  81.    name="TestWebServiceSoap12" type="tns:TestWebServiceSoap"> 
  82.      transport="http://schemas.xmlsoap.org/soap/http" /> 
  83.      name="HelloWorld"> 
  84.        soapAction="http://tempuri.org/HelloWorld" style="document" /> 
  85.        
  86.          use="literal" /> 
  87.        
  88.        
  89.          use="literal" /> 
  90.        
  91.      
  92.      name="GetArray"> 
  93.        soapAction="http://tempuri.org/GetArray" style="document" /> 
  94.        
  95.          use="literal" /> 
  96.        
  97.        
  98.          use="literal" /> 
  99.        
  100.      
  101.    
  102.    name="TestWebService"> 
  103.      name="TestWebServiceSoap" binding="tns:TestWebServiceSoap"> 
  104.        location="http://localhost/phpmyadmin/ws/TestWebService.php" /> 
  105.      
  106.      name="TestWebServiceSoap12" binding="tns:TestWebServiceSoap12"> 
  107.        location="http://localhost/phpmyadmin/ws/TestWebService.php" /> 
  108.      
  109.    
  110.  

WSDL的代码比较长,当方法很多时,手敲代码是不太可能的。有一个巧的办法,就是也用.NET实现一个不含真正方法体的Web Serivce,然后通过http://***/TestWebService.asmx?wsdl的方法生成wsdl代码文件。

关于WSDL文件,我要说明特别说明两点:

(1)soap:address结点是声明WebService的地址,在部署时要改成相应地址;

(2)一维数组的声明类型为ArrayOfType,字符串数组为ArrayOfString。如果Type不是简单类型,则Type需要另外声明。

2).NET客户端代码

先要添加Web引用,地址为WSDL文件的Http地址。

.NET调用PHP Web Service调用代码(C#)

  1. //初始化WebService  
  2.         localhost.TestWebService srv = new localhost.TestWebService();  
  3.         //调***个方法  
  4.          string str = srv.HelloWorld();  
  5.         //调第二个方法  
  6.          string[] arry= srv.GetArray("string1","string2"); 

.NET调用PHP Web Service总结:

(一)PHP是一种弱类型语言,检查错误比较困难。array类型也与一般理解的数组不同,它也有类似Hashtable的用法。

(二)PHP Web Service方法的传入参数、返回值都至多有一个,因为真正调用时的参数和返回值,都是包装到一个对象中传送的。

(三)PHP Web Service也支持自定义类型和自定义类型数组等复杂类型,但不支持多组数组。

(四)若返回值需要是多张二维表时,我浅薄的以为,可以传化一组字符串数组传送,格式为

[表1行数],[表1列数],[表1列名1],[表1列名2],……[表1列名N],[表1中按行列存放的值]

[表2行数],[表2列数],[表2列名1],[表2列名2],……[表2列名N],[表2中按行列存放的值]……

[表M行数],[表M列数],[表M列名1],[表M列名2],……[表M列名N],[表2中按行列存放的值]

按顺序将上面[]中的内容串成字符串数组,效率还不错,我测试10000行240列的数据,我有现成编解代码,有兴趣的可以向我索取.

【编辑推荐】

  1. PHP 5.3中的命名空间使用方法浅述
  2. PHP 5.3.0发布 新增命名空间等多项特性
  3. PHP的命名空间
  4. PHP 5.3闭包语法初探
  5. PHP 5.3新版特性浅析

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...