|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
以前学了大概半年时间的asp(没有机会做大系统,最多是自己对公司系统做些调整和修改还有一些小程序)。应该说开始接触asp.net是今年元月5号的事。现在很想把公司的系统重新用.net来架构,却不知道如何下手。整合散布式使用程序常常是一件十分坚苦而且扑朔迷离的义务,即便是最富有履历的开辟者也大概会以为头疼。当使用程序在分歧的操纵体系和触及分歧的程序平台时,这个集成成绩变得特别庞大。固然说,Web服务答应能够加重程序员完成集成义务的坚苦水平,可是也大概给程序员们带来一些意想不到的贫苦。在这里我们将把一个ASP.net使用程序和一个PHPWeb服务保持起来,以进修一些整合散布式使用程序的办法,和需要的应对措施,包含运转甚么和不必往做甚么。
这个Web服务在一个Apache服务器上运转,而且利用PHP开辟。它从各类微软旧事组检索旧事择要和它们的联系关系的文本。即便由这个服务供应的数据能够间接利用外部的。Net工具存取,可是这个服务仍是将利用并供应一个毗连到非。Net平台上的不错的演示。我们这里要会商的实例基于。Netbeta2版。
创立一个Web服务代办署理[img=1style=,1src=]http://www.ckuyun.com/[/img]
VisualStudio.NET供应了一个杰出的机制用于主动地天生可用于存取远程Web服务的代办署理对像。因而,要起首实验利用这些函数来导进由PHP服务供应的Web服务形貌言语(WebServicesDescriptionLanguage,WSDL)文件。还可使用.NetSDK的WSDL.exe命令行公用程序。不幸的是,在利用VS.net导游导进WSDL以后,其实不能乐成地创立一个代办署理。以是我必需把导进原始的WSDL文件后由VS.Net天生的文件转换为WSDL:
◆把形式域名空间从http://www.w3.org/1999/XMLSchema改成http://www.w3.org/2001/XMLSchema然后扫除一切确当WSDL导进过程当中由VS.Net增加的”q”域名空间。
◆删除xmlns:tm=http://microsoft.com/wsdl/mime/textMatching/和xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"名字空间,由于这个使用程序中不必要包括这些。
◆删除范例元素,由于原始的WSDL文档并没有包括Web服务的形式信息的指定的元素区段。
◆改动输出输入元素动静属性值为包括tns域名空间前缀的情势:
以下为援用的内容:<portTypename="nntpSoapPortType">
<operationname="getheaders"parameterOrder="newsgroupnumitems">
<inputmessage="tns:getheaders"/>
<outputmessage="tns:getheadersresponse"/>
</operation>
<operationname="getarticle"parameterOrder="newsgrouparticle">
<inputmessage="tns:getarticle"/>
<outputmessage="tns:getarticleresponse"/>
</operation>
</portType>
在举行了上面的这些巨大的改动,VS.Net导游可以读取WSDL而且主动地天生一个代办署理。在编译了这个代办署理以后,它被包括在一个ASP.NET页面中。但是,当这个ASP.Net页面被实行:“messagedoesnothaveacorrectSOAProotXMLtag.”,这个毛病被看成一个SOAP毛病从Web服务中前往。
为了准确地评价这个毛病,代办署理挪用被一个名为ProxyTrace的公用程序利用,以便代办署理天生SOAP包装。这能够经由过程把以下代码增加进ASP.Net页面来完成:
msNews.Proxy=newSystem.Net.WebProxy(http://localhost:8080);
在观察了由.Net代办署理天生的SOAP包装以后,我有点奇异为何会前往这个毛病,由于实践上一个绝对的SOAP包装被天生并被发送到Web服务。即便在实验了好几个转化成代办署理代码以后这个毛病仍然延续。代码段列表2显现了从PHPWeb服务前往的完全的SOAP毛病包装。
在利用VS.Net中创立的代办署理工具的好几个把ASP.Net页面与PHPWeb服务保持的不乐成的实验以后,我决意重新入手下手创立SOAP包装以便实行更无效的程序调试。{起先,它看起来仿佛由.Net代办署理天生的形式域名空间多是成绩的关头,由于.Net利用2001形式标准而PHP服务利用的是1999版本的标准。
但是,我把自界说的SOAP包装改成用1999版本取代2001版本,毛病仍然存在。在实验了好几个其他的小的改动以后,我决意把SOAP包装利用的域名空间前缀和注释元素从soap(由.Net代办署理天生)改成SOAP-ENV,由于我瞥见在SOAP毛病信息中前往了SOAP-ENV前缀。(见代码2)这外表上看上往微乎其微的改动竟办理了成绩!当处置任何哀求的时分,PHP服务明显必要SOAP-ENV前缀,而回绝不包括SOAP-ENV前缀的请求。
创立一个自界说代办署理
既然已懂得了为何Web服务前往一个SOAP毛病,我们就能够创立一个自界说代办署理来天生网服务等候的SOAP包装。固然创立一个自界说SOAP包装一定比利用一个由VS.net大概WSDL.exe公用程序天生的SOAP包装要花更多的工夫,可是如许做能够完整把持包装的内容。为了入手下手创立自界说代办署理,我创立一个名为msnewsserviceproxy的包括两个字段的新类:
以下为援用的内容:publicclassMSNewsServiceProxy{
string_uri;
string_soapAction;
}
uri字段保留了Web服务的地位,而_soapAction字段保留了将要利用SOAP包装发送的SOAPAction数据头的称号。在MSNewsServiceProxy类以内,增加CreateSoapEnvelope(),SendSoapEnvelope()和FilterResult()这三个办法。这些办法天生SOAP包装哀求,把它发送到Web服务,然后过滤前往的SOAP包装。让我们一一的看看每一个办法。注重代码在SOAP包装的根元素上增加一个SOAP-ENV域名空间前缀。Web服务明显必要这个特定的前缀,而回绝任何不包括这个前缀的信息。由于VS.net天生的代办署理发送一个soap域名空间前缀(而不是SOAP-ENV),以是它的动静被回绝。Web服务不该该必要一个特定的域名空间前缀而为此回绝不带此前缀的动静,可是域名空间成绩也是你必需注重要想使事情更好的完成,要实行一些看上往不{0>可思议的事变。
在SOAP包装被创立以后,SendSoapEnvelope()办法(见代码段4)利用了几个System.Net和System.IO域名空间中的类来把这个包装发送到Web服务中。代码起首经由过程把_uri变量传送到工具机关器来创立一个HttpWebRequest工具。其次,与这个哀求相干联的响应的Method,ContentType和Header都将被发送。
然后一个StreamWriter工具和HttpWebRequest工具的哀求流相干联,SOAP包装就被利用StreamWriter的Write()办法写到流中。
从Web服务前往的SOAP包装被HttpWebResponse工具的SendSoapEnvelope()办法取得。
HttpWebResponseresponse=(HttpWebResponse)request.GetResponse();
假如应对不是空值,它将被载进一个XMLTextReader,XMLTextReader被用来添补XmlDocument工具。然后从这个办法中前往XmlDocument工具。
FilterSoapEnvelope()办法剖析SOAP应对包装并把从Web服务中前往的数据装进自界说代办署理的“消耗者”利用的XmlDocument工具:
以下为援用的内容:privateXmlDocument
FilterSoapEnvelope(
XmlDocumentdoc){
XmlDocumentfilterDoc=newXmlDocument();
XmlNoderesult=doc.SelectSingleNode("//results");
XmlNoderesultImport=filterDoc.ImportNode(result,true);
filterDoc.AppendChild(resultImport);
returnfilterDoc;
}
固然过滤器可使用好几种办法实行,可是FilterSoapEnvelope()办法依托XPath语句能够在应对SOAP包装中失掉了局元素。
微软旧事组PHPWeb服务展现了同意获得旧事组旧事择要的两种办法:getheaders()和getmessage()。你能够看到怎样在自界说代办署理类中利用这两种办法(见代码段5)。注重每一个办法中的代码传送Web服务办法名被挪用到CreateSoapEnvelope()办法和任何利用这个办法联系关系的参数。在SOAP包装被发送和应对被承受以后,FilterSoapEnvelope()办法被挪用来把前往的数据加载到一个XmlDocument工具中,一样,这个工具也是代办署理“消耗者”利用的。
不过你如果学.net的话,你就不要选os了,这课比较底层的。你可以旁听数据库加上软件构件和中间件。(webservices和面向服务的课也应该听一听) |
|