我有这个问题,我不确定为什么会这样,以及如何解决它。我创建了一个OSB项目。在代理服务管道中,我正在为另一个应用程序中的同步SOAP服务执行服务调用。其他服务需要请求正文如下:
<RequestSelectionValues xmlns="http://www.camstar.com/WebService/WSShopFloor">
<inputServiceData xmlns:q1="http://www.camstar.com/WebService/DataTypes" q1:type="OnlineQuery">
<OnlineQuerySetup>
<__CDOTypeName/>
<__name>xLot By FabLotNumber</__name>
</OnlineQuerySetup>
<Parameters>
<__listItem>
<Name>FabLotNumber</Name>
<DefaultValue>FAB_Lot_1</DefaultValue>
</__listItem>
<__listItem>
<Name>BLOCKOF200ROWS</Name>
<DefaultValue>1</DefaultValue>
</__listItem>
</Parameters>
</inputServiceData>
<queryOption xmlns:q2="http://www.camstar.com/WebService/DataTypes" q2:type="QueryOption">
<RowSetSize>1000</RowSetSize>
<StartRow>1</StartRow>
<QueryType>user</QueryType>
<ChangeCount>0</ChangeCount>
<RequestRecordCount>false</RequestRecordCount>
<RequestRecordSetAndCount>false</RequestRecordSetAndCount>
</queryOption>
<serviceInfo xmlns:q3="http://www.camstar.com/WebService/DataTypes" q3:type="OnlineQuery_Info">
<OnlineQuerySelection>
<RequestValue>false</RequestValue>
<RequestMetadata>false</RequestMetadata>
<RequestSubFieldValues>false</RequestSubFieldValues>
<RequestSelectionValues>true</RequestSelectionValues>
</OnlineQuerySelection>
</serviceInfo>
</RequestSelectionValues>
我使用Assign将上面的表达式放在变量中。
注意这一行:
<serviceInfo xmlns:q3="http://www.camstar.com/WebService/DataTypes" q3:type="OnlineQuery_Info">
xmlns:q3 =“http://www.camstar.com/WebService/DataTypes”需要在q3之前:type =“OnlineQuery_Info”,以便成功调用其他服务,否则服务调用将失败。
在开发中它看起来很好。我也可以测试表达式的分配。
当我去OSB控制台测试服务时,我注意到在Assign变量中,命名空间位置切换,它变成这样:
<serviceInfo q3:type="OnlineQuery_Info" xmlns:q3="http://www.camstar.com/WebService/DataTypes">
这使服务调用失败。我已经尝试将身体有效负载放在xslt中。结果是一样的。我不确定为什么它在命名空间之前切换类型。最终结果是服务没有按预期工作。
知道我可以做些什么来解决这个问题。如何防止切换?
由于
答案 0 :(得分:0)
我没有在OSB中找到任何可以阻止为您重新排序属性的设置。但是,上述OSB行为完全符合XML标准。实际上,目标服务端应该是XML兼容的,并且将上面提到的两个变体视为相同,因为根据XML标准,只有属性排序差异的两个XML文档应该被视为相同。
编辑: 请转here下载修改后的配置。我的想法是:
答案 1 :(得分:0)
我能想到的一个解决方案是在父标签级别分配所有名称空间,并将属性保留在适用的位置。
示例:
<RequestSelectionValues xmlns:q1="http://www.camstar.com/WebService/DataTypes" xmlns="http://www.camstar.com/WebService/WSShopFloor" xmlns:q2="http://www.camstar.com/WebService/DataTypes" xmlns:q3="http://www.camstar.com/WebService/DataTypes">
但是这个实现的问题在于,由于名称空间声明现在是Global,因此必须将名称空间前缀(q1,q2,q3)声明为先前定义名称空间的块。
示例:
<q3:serviceInfo q3:type="OnlineQuery_Info">
<q3:OnlineQuerySelection>
<q3:RequestValue>false</q3:RequestValue>
<q3:RequestMetadata>false</q3:RequestMetadata>
<q3:RequestSubFieldValues>false</q3:RequestSubFieldValues>
<q3:RequestSelectionValues>true</q3:RequestSelectionValues>
</q3:OnlineQuerySelection>
</q3:serviceInfo>
如果未声明此命名空间前缀,则根据XML标准,标记将采用“默认”命名空间值 - 这将是父级的命名空间。
然而,即使这个解决方案有一个全面的实现方式,这个解决方案肯定会有效。