兰色精灵 发表于 2015-1-16 22:23:50

ASP.NET网页编程之.NET调PHP Web Service的典范例子

对于new隐藏成员的作用,往往是出于使用了一个第三方类库,而你又无法获得这个类库的源代码,当你继承这个类库的某个类时,你需要重新实现其中的一个方法,而又需要与父类中的函数使用同样的函数,这是就需要在自定义的子类中把那个同名函数(或成员)加上new标记,从而隐藏父类中同名的成员。比来一个项目由“WinForm间接会见DB2”移植到“WinForm经由过程PHPWebService来会见DB2”。(长处是php能够架在Linux上,而Linux是收费的)这个命题的难点不是会见DB2,而是.NET挪用PHP的WebService。关于我这个临时作.NET,之前一向觉得只要.NET才能够做WebService……的人来讲,真是有点强“聪”所难了。可是成绩仍是要办理的,刻日就摆在长远呢。经由一番查询拜访,终究有了头绪,如今分享给人人。
起首要申明的,PHP服务器必要最少必要两个文件——一个WSDL文件和一个PHP文件。WSDL文件是一种机读的XML文件,用于形貌WebService供应的服务和挪用办法(关于.NET则能够主动天生挪用代码,非常好用),php文件就是真正完成的WEB服务了。
1)PHP服务器端代码
1-1)TestWebService.php代码
以下为援用的内容:
<?php
classTestWebService
{
publicfunctionHelloWorld()
{
returnarray("HelloWorldResult"=>"Hello");
}
publicfunctionGetArray($args)
{
/*
注重,WebService的办法在声明时最多一个参数,
但是在挪用该办法时就必需传value1,value2两个参数。
(这一点非常使人隐晦,我的了解是,在挪用该办法时,体系把一切参数都放到一个工具里传过去的)
*/
$value1=$args->value1;
$value2=$args->value2;//这两句是猎取真实的参数

$arry=array($value1,$value2);
//前往值也很出格,不是间接前往$arry,而是把它放到一个工具里再前往。
returnarray("GetArrayResult"=>$arry);
}
}
//创立WebSevice实例
$server=newSoapServer("TestWebService.wsdl");
//指定类名
$server->setClass("TestWebService");
$server->handle();

?>


1-2)TestWebService.wsdl代码
以下为援用的内容:
<?xmlversion="1.0"encoding="utf-8"?>
<wsdl:definitionsxmlns: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/">
<wsdl:types>
<s:schemaelementFormDefault="qualified"targetNamespace="http://tempuri.org/">
<s:elementname="HelloWorld">
<s:complexType/>
</s:element>
<s:elementname="HelloWorldResponse">
<s:complexType>
<s:sequence>
<s:elementminOccurs="0"maxOccurs="1"name="HelloWorldResult"type="s:string"/>
</s:sequence>
</s:complexType>
</s:element>
<s:elementname="GetArray">
<s:complexType>
<s:sequence>
<s:elementminOccurs="0"maxOccurs="1"name="value1"type="s:string"/>
<s:elementminOccurs="0"maxOccurs="1"name="value2"type="s:string"/>
</s:sequence>
</s:complexType>
</s:element>
<s:elementname="GetArrayResponse">
<s:complexType>
<s:sequence>
<s:elementminOccurs="0"maxOccurs="1"name="GetArrayResult"type="tns:ArrayOfString"/>
</s:sequence>
</s:complexType>
</s:element>
<s:complexTypename="ArrayOfString">
<s:sequence>
<s:elementminOccurs="0"maxOccurs="unbounded"name="string"nillable="true"type="s:string"/>
</s:sequence>
</s:complexType>
</s:schema>
</wsdl:types>
<wsdl:messagename="HelloWorldSoapIn">
<wsdl:partname="parameters"element="tns:HelloWorld"/>
</wsdl:message>
<wsdl:messagename="HelloWorldSoapOut">
<wsdl:partname="parameters"element="tns:HelloWorldResponse"/>
</wsdl:message>
<wsdl:messagename="GetArraySoapIn">
<wsdl:partname="parameters"element="tns:GetArray"/>
</wsdl:message>
<wsdl:messagename="GetArraySoapOut">
<wsdl:partname="parameters"element="tns:GetArrayResponse"/>
</wsdl:message>
<wsdl:portTypename="TestWebServiceSoap">
<wsdl:operationname="HelloWorld">
<wsdl:inputmessage="tns:HelloWorldSoapIn"/>
<wsdl:outputmessage="tns:HelloWorldSoapOut"/>
</wsdl:operation>
<wsdl:operationname="GetArray">
<wsdl:inputmessage="tns:GetArraySoapIn"/>
<wsdl:outputmessage="tns:GetArraySoapOut"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:bindingname="TestWebServiceSoap"type="tns:TestWebServiceSoap">
<soap:bindingtransport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operationname="HelloWorld">
<soap:operationsoapAction="http://tempuri.org/HelloWorld"style="document"/>
<wsdl:input>
<soap:bodyuse="literal"/>
</wsdl:input>
<wsdl:output>
<soap:bodyuse="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operationname="GetArray">
<soap:operationsoapAction="http://tempuri.org/GetArray"style="document"/>
<wsdl:input>
<soap:bodyuse="literal"/>
</wsdl:input>
<wsdl:output>
<soap:bodyuse="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:bindingname="TestWebServiceSoap12"type="tns:TestWebServiceSoap">
<soap12:bindingtransport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operationname="HelloWorld">
<soap12:operationsoapAction="http://tempuri.org/HelloWorld"style="document"/>
<wsdl:input>
<soap12:bodyuse="literal"/>
</wsdl:input>
<wsdl:output>
<soap12:bodyuse="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operationname="GetArray">
<soap12:operationsoapAction="http://tempuri.org/GetArray"style="document"/>
<wsdl:input>
<soap12:bodyuse="literal"/>
</wsdl:input>
<wsdl:output>
<soap12:bodyuse="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:servicename="TestWebService">
<wsdl:portname="TestWebServiceSoap"binding="tns:TestWebServiceSoap">
<soap:addresslocation="http://localhost/phpmyadmin/ws/TestWebService.php"/>
</wsdl:port>
<wsdl:portname="TestWebServiceSoap12"binding="tns:TestWebServiceSoap12">
<soap12:addresslocation="http://localhost/phpmyadmin/ws/TestWebService.php"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>


WSDL的代码对照长,当办法良多时,手敲代码是不太大概的。有一个巧的举措,就是也用.NET完成一个不含真正办法体的WebSerivce,然后经由过程http://***/TestWebService.asmx?wsdl的办法天生wsdl代码文件。
关于WSDL文件,我要申明出格申明两点:
(1)soap:address结点是声明WebService的地点,在部署时要改成响应地点;
(2)一维数组的声明范例为ArrayOfType,字符串数组为ArrayOfString。假如Type不是复杂范例,则Type必要别的声明。
2).NET客户端代码
先要增加Web援用,地点为WSDL文件的Http地点。
挪用代码(C#)
以下为援用的内容:
//初始化WebService
localhost.TestWebServicesrv=newlocalhost.TestWebService();
//调第一个办法
stringstr=srv.HelloWorld();
//调第二个办法
string[]arry=srv.GetArray("string1","string2");


总结:(一)PHP是一种弱范例言语,反省毛病对照坚苦。array范例也与一样平常了解的数组分歧,它也有相似Hashtable的用法。
(二)PHPWebService办法的传进参数、前往值都最多有一个,由于真正挪用时的参数和前往值,都是包装到一个工具中传送的。
(三)PHPWebService也撑持自界说范例和自界说范例数组等庞大范例,但不撑持多组数组。
(四)若前往值必要是多张二维表时,我浅陋的觉得,能够传化一组字符串数组传送,格局为
[表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列的数据,我有现成编解代码,有乐趣的能够向我讨取.
语言是不是不是最重要的?

飘飘悠悠 发表于 2015-1-17 19:50:28

主流网站开发语言之ASP:ASP是微软(Microsoft)所开发的一种后台脚本语言,它的语法和VisualBASIC类似,可以像SSI(ServerSideInclude)那样把后台脚本代码内嵌到HTML页面中。虽然ASP简单易用,但是它自身存在着许多缺陷,最重要的就是安全性问题。

深爱那片海 发表于 2015-1-21 07:46:10

Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。

因胸联盟 发表于 2015-1-30 11:47:38

微软又推出ASP.NET。这不是ASP的简单升级,而是全新一代的动态网页实现系统,用于一台WEB服务器建立强大的应用程序。是微软发展的新体系结构.NET的一部分,是ASP和.NET技术的结合。

老尸 发表于 2015-2-6 11:06:38

平台无关性是PHP的最大优点,但是在优点的背后,还是有一些小小的缺点的。如果在PHP中不使用ODBC,而用其自带的数据库函数(这样的效率要比使用ODBC高)来连接数据库的话,使用不同的数据库,PHP的函数名不能统一。这样,使得程序的移植变得有些麻烦。不过,作为目前应用最为广泛的一种后台语言,PHP的优点还是异常明显的。

飘灵儿 发表于 2015-2-16 00:48:30

这也就是最近几年来随着各种新的后台技术的诞生,CGI应用在Internet上越来越少的原因。CGI方式不适合大访问量的应用。

活着的死人 发表于 2015-3-4 19:55:16

众所周知,Windows以易用而出名,也因此占据不少的服务器市场。

不帅 发表于 2015-3-11 20:52:30

ASP.net的服务器,要求安装一个.net环境,当然我这里指的是windows系统,顺便点一下,.net只能放在windows环境里来运行。Asp.net1.1的就装Framework1.1,Asp.net2.0的就装Framework2.0。

冷月葬花魂 发表于 2015-3-19 13:05:39

主流网站开发语言之JSP:JSP和Servlet要放在一起讲,是因为它们都是Sun公司的J2EE(Java2platformEnterpriseEdition)应用体系中的一部分。

柔情似水 发表于 2015-3-28 07:04:54

Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。
页: [1]
查看完整版本: ASP.NET网页编程之.NET调PHP Web Service的典范例子