科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件把.Net整合进其他平台

把.Net整合进其他平台

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

整合分布式应用程序经常是一件非常困难并且错综复杂的任务,即使是最富有经验的开发者也可能会觉得头疼

作者:合肥小雨 来源:yesky 2007年11月5日

关键字: 整合 平台

  • 评论
  • 分享微博
  • 分享邮件
整合分布式应用程序经常是一件非常困难并且错综复杂的任务,即使是最富有经验的开发者也可能会觉得头疼。当应用程序在不同的操作系统以及涉及不同的程序平台时,这个集成问题变得尤其复杂。虽然说,Web服务承诺可以减轻程序员完成集成任务的困难程度,但是也可能给程序员们带来一些意想不到的麻烦。在这里我们将把一个ASP.Net应用程序和一个PHP Web服务连结起来,以学习一些整合分布式应用程序的方法,以及必要的应对措施,包括运行什么以及不用去做什么。

  这个Web服务在一个Apache服务器上运行,并且使用PHP开发。它从各种微软新闻组检索新闻摘要以及它们的关联的文本。即使由这个服务提供的数据可以直接使用内部的.Net对象存取,但是这个服务还是将使用并提供一个连接到非.Net平台上的不错的演示。我们这里要讨论的实例基于.Net beta 2版。

  创建一个Web服务代理

  Visual Studio.NET提供了一个出色的机制用于自动地生成可用于存取远程Web服务的代理对像。因此,要首先尝试使用这些函数来导入由PHP服务提供的Web服务描述语言(Web Services Description Language,WSDL)文件。 还可以使用.Net SDK的WSDL.exe命令行公用程序。不幸的是,在使用VS.Net向导导入WSDL之后,并不能成功地创建一个代理。所以我必须把导入原始的WSDL文件后由VS.Net生成的文件转换为WSDL:

  1. 把模式域名空间从http://www.w3.org/1999/XMLSchema改成http://www.w3.org/2001/XMLSchema 然后清除所有的当WSDL导入过程中由VS.Net添加的”q”域名空间。

  2. 删除 xmlns:tm=http://microsoft.com/wsdl/mime/textMatching/和xmlns: mime="http://schemas.xmlsoap.org/wsdl/mime/" 名字空间,因为这个应用程序中不需要包含这些。

  3. 删除类型元素,因为原始的 WSDL文档 并没有包含Web服务的模式信息的指定的元素区段。

  4. 改变输入输出元素消息属性值为包含tns域名空间前缀的形式:

<portType name="nntpSoapPortType">
<operation name="getheaders" parameterOrder="newsgroup numitems">
<input message="tns:getheaders" />
<output message="tns:getheadersresponse" />
</operation>
<operation name="getarticle" parameterOrder="newsgroup article">
<input message="tns:getarticle" />
<output message="tns:getarticleresponse" />
</operation>
</portType>

  在进行了下面的这些微小的改变,VS.Net向导能够读取WSDL并且自动地生成一个代理。在编译了这个代理之后,它被包含在一个ASP.Net页面中。然而,当这个ASP.Net页面被执行:“ message does not have a correct SOAP root XML tag.”,这个错误被当作一个SOAP错误从Web服务中返回。为了精确地评估这个错误,代理调用被一个名为Proxy Trace的公用程序使用,以便代理生成SOAP包装。这可以通过把下列代码添加进ASP.Net页面来实现:

  msNews.Proxy = new System.Net.WebProxy( "http://localhost:8080");

  在察看了由.Net代理生成的SOAP包装之后,我有点奇怪为什么会返回这个错误,因为实际上一个相对的SOAP包装被生成并被发送到Web服务。即使在尝试了好几个转化成代理代码之后这个错误依然持续。代码段列表2显示了从PHP Web服务返回的完整的SOAP错误包装。

  在使用VS.Net中创建的代理对象的好几个把ASP.Net页面与PHP Web服务连结的不成功的尝试之后,我决定从头开始创建SOAP包装以便执行更有效的程序调试。{起先,它看起来好像由.Net代理生成的模式域名空间可能是问题的关键,因为.Net使用2001模式规范而PHP服务使用的是1999版本的规范。

  然而,我把自定义的SOAP包装改为用1999版本代替2001版本,错误依然存在。在尝试了好几个其他的小的改变之后,我决定把SOAP包装使用的域名空间前缀和正文元素从soap (由.Net代理生成)改为SOAP - ENV,因为我看见在SOAP错误信息中返回了SOAP - ENV前缀。(见代码2)这表面上看上去微不足道的改变竟解决了问题!当处理任何请求的时候,PHP服务显然需要SOAP - ENV前缀,而拒绝不包含SOAP - ENV前缀的要求。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章