使用DTD的代理服务

时间:2015-04-24 14:15:57

标签: xml proxy wso2esb

我创建了一个代理服务来从Web接收XML。适用于带XSD的XML ,但是当 DOCTYPE 声明带有 DTD 时会失败。我添加了参数' ApplicationXMLBuilder.allowDTD' ,但仍然看到错误。有什么想法吗?

代理配置:

entry

示例请求XML:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
   name="cx.soa.poxRouter"
   transports="https,http"
   statistics="disable"
   trace="disable"
   startOnLoad="true">
  <target>
  <inSequence>
     <router>
        <route xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
               expression="local-name(/env:Body/*)"
               match="Invoice">
           <target to="" soapAction="urn:process">
              <sequence>
                 <class name="cx.wso2.mediators.addNamespace">
                    <property name="nsToAdd" value="http://xmlns.ingram.com/invoice"/>
                 </class>
                 <log level="full"/>
                 <send>
                    <endpoint key="invoice.incoming.ingram.cxtec.prd.endpoint"/>
                 </send>
              </sequence>
           </target>
        </route>
        <route expression="true()">
           <target to="" soapAction="">
              <sequence>
                 <makefault version="soap11">
                    <code xmlns:soap11Env="http://schemas.xmlsoap.org/soap/envelope/"
                          value="soap11Env:Server"/>
                    <reason value="Message Not Understood"/>
                    <role/>
                 </makefault>
                 <property name="RESPONSE" value="true"/>
                 <send/>
              </sequence>
           </target>
        </route>
     </router>
  </inSequence>
</target>
<parameter name="ApplicationXMLBuilder.allowDTD">true</parameter>
<parameter name="transport.vfs.ContentType">application/xml</parameter>
<parameter name="serviceType">proxy</parameter>
<description/>
</proxy>

错误日志:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.025/cXML.dtd">
<cXML payloadID="1429879833205-3629664823566250562@216.109.111.63"
timestamp="2015-04-24T05:50:33-07:00" version="1.2.025" xml:lang="en-US">
  <Header>      
  </Header>
  <Request deploymentMode="test">
  </Request>
</cXML>

1 个答案:

答案 0 :(得分:1)

WSO2 ESB 小组的生产支持讨论后,以下是使其有效的选项列表:

1. Enable DTD processing globally

如果您正在使用消息跟踪器,则必须全局启用DTD处理。通过将以下属性添加到&#39; ESB_HOME / repository / conf / axis2 / axis2.xml&#39; 来全局启用DTD处理。

<parameter name="ApplicationXMLBuilder.allowDTD">true</parameter>

在Apache Axis中启用DTD处理存在安全问题。 DTD Security Concerns

2. Disable message tracing

在生产环境中,不建议启用邮件跟踪,因为它会增加显着的性能开销。如果我们禁用跟踪,则上述问题不会首先发生。

在我们的案例中,由于其他原因,我们必须启用邮件跟踪,因此按照案例(1)解决了问题。