0

我有这个问题,我不确定它为什么会发生以及如何解决它。我创建了一个 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。结果是一样的。我不确定为什么它会在命名空间之前切换类型。最终结果是服务没有按预期工作。

知道我能做些什么来解决这个问题。如何防止切换?

谢谢

4

2 回答 2

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">

但这个实现的问题在于,由于命名空间声明现在是全局的,因此您必须将命名空间前缀(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 标准,该标记采用“默认”命名空间值 - 这将是父命名空间。

然而,即使这个解决方案有一个迂回的实现方式,这个解决方案肯定会奏效。

于 2014-12-23T10:25:41.363 回答
0

我没有在 OSB 中找到任何可以阻止为您重新排序属性的设置。但是,上述 OSB 行为完全符合 XML 标准。实际上,目标服务端应该是XML兼容的,将上面提到的两种变体视为相同,因为根据XML标准,只有属性排序不同的两个XML文档应该被视为相同。

编辑:请到这里下载修改后的配置。我的想法是:

  1. 指定在“Text as Request”模式下调用的业务服务,如“CamstarLotQuery/business/CSWSShopFloor_Txt”所示: 在此处输入图像描述
  2. 如“CamstarLotQuery/proxy/CamstarLotQueryTxt_Txt”中所指定,在您的代理服务中将消息作为文本而不是 XML 进行处理:
  3. 在调用业务服务时,您可能需要在 http 标头中指定 SOAP 操作,具体取决于目标服务。
于 2013-11-03T04:57:06.373 回答