为什么同一个SOAP请求在一个Flex项目中工作而不是另一个?

时间:2010-02-15 03:30:20

标签: flex actionscript-3 web-services flash

这是我在这里非常奇怪的情况。我已经使用一段代码与后端SOAP服务进行了几个月的交互 - 它运行正常。我在一个不同的项目中尝试过(首先是作为swc库,然后只是通过剪切和粘贴),它只是不起作用。

如果我在原始flex项目中尝试完全相同的代码,连接到相同的后端服务,一切正常。在新项目中,我可以调用将简单文档 - 文字包装器作为参数(它们没有实际参数)的操作 - 但是如果操作在文档文字包装器中有一个复杂参数 - 则在这个新项目上失败。这是一个失败的样本:

var service:WebService = new WebService();
service.wsdl = wsdlURL;
var operation:AbstractOperation = service.getOperation( "addNewUser" );

var param:XML = <AddNewUserRequest/>
param.setNamespace( myNameSpace );

param.user.username( username );
param.user.email( email );

operation.send( param );

这是一个可以在新项目中使用的示例:

var service:WebService = new WebService();
service.wsdl = wsdlURL;
var operation:AbstractOperation = service.getOperation( "getUsers" );

var param:XML = <GetUsersRequest/>
param.setNamespace( myNameSpace );

operation.send( param );

以下是我尝试追踪这一曲目的一些事情:

- 检查了来自两个项目的firebug中的帖子,并且看不出差异(意味着代码似乎在两个项目中生成完全相同的SOAP请求(正如人们所期望的那样) - 我已经验证了请求应该使用SOAPui直接查询Web服务

后端服务是Apache CXF Web服务,以下是它生成的错误示例:

  

org.apache.cxf.interceptor.Fault:找到元素{http://www.w3.org/2001/XMLSchema}用户但找不到匹配的RPC / Literal部分

我所知道的一切都让我相信用户应该在http://www.w3.org/2001/XMLSchema命名空间中 - 老实说 - 我相信这里的关键是代码在一个项目中工作而在另一个项目中不起作用。它可以是XML设置吗?像ignoreWhitespace这样的静态之一?我玩过改变周围的人 - 没有运气。

有什么想法吗?这让我发疯了!!!

更新:

我已经缩小到这个范围:新项目创建了一个这样的标题:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

和有效的那个创造了这个:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

为什么在完全相同版本的flex&amp; amp; flex builder?有效的方法显然是正确的(xmlns:xsd =“http://www.w3.org/2001/XMLSchema”) - Web服务正确拒绝将请求中的所有内容放入xsd名称空间的请求。 / p>

2 个答案:

答案 0 :(得分:2)

xmlns="http://www.w3.org/2001/XMLSchema"添加到SOAP信封而不是xmlns:xsd="http://www.w3.org/2001/XMLSchema"的原因是因为它是在rpc.xml.SchemaConstants类中定义的。在已损坏的项目中的某个时刻,您已将xsd导入到定义xmlns="http://www.w3.org/2001/XMLSchema"的rpc.xml.SchemaManager类中,该类将覆盖SchemaConstants中的默认定义。

尝试检查您正在使用的所有xsds,并确保它们不包含xmlns="http://www.w3.org/2001/XMLSchema"

答案 1 :(得分:1)

您将请求硬编码为XML,并且我假设您的自定义命名空间没有前缀,因此它与标头中声明的XSD的默认命名空间冲突。为什么你会得到我不知道的不同标题,但你可能正在用不同版本的SDK编译你的项目。

要尝试的一些事项:

  • 确保您使用清酒SDK来编译这两个项目(您可以使用最新版本,因为几乎每个版本都会对SOAP堆栈进行错误修正)

  • 使用以下命令为命名空间设置显式前缀:

    var myNameSpace:NameSpace = new NameSpace("my","http://something.com/foo/ns");

  • 不是构建XML请求,而是将其构建为普通的AS3对象,如下所示:

    var request:Object = {GetUsersRequest: {parm1: foo, parm2:bar }};

    ...让Flex为您完成所有编码。一大堆人(包括我自己)花了不少时间让Flex SOAP堆栈与AS3对象配合使用,而不是手工制作的XML请求,为什么不让SDK完成为你构建请求的工作呢?