代码之家  ›  专栏  ›  技术社区  ›  Thomas Einwaller

优化Web服务的XML响应

  •  1
  • Thomas Einwaller  · 技术社区  · 15 年前

    在Web服务的性能测试中,我们发现 交通 反应产生的结果大大超出了我们的预期。我们正在查询数据库并加载由行和列组成的列表。

    列的类型为 任何类型 所以在响应中需要有一个类型信息。因此,Web服务引擎(axis2或jaxws)增加了许多 命名空间信息多次 . 请参阅以下示例响应:

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
       <soapenv:Body>
          <ns3:loadListResponse xmlns:ns3="http://example.com/test/service-types-1.0" 
          xmlns:ns2="http://example.com/lists/lists-types-1.0" >
             <ns3:value>
                <ns2:row>
                   <ns2:column xsi:type="xs:int" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">12345</ns2:column>
                   <ns2:column xsi:type="xs:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">XYZ</ns2:column>
                   <ns2:column xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
                   <ns2:column xsi:type="xs:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">ABC</ns2:column>
                </ns2:row>
                <ns2:row>
                   <ns2:column xsi:type="xs:int" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">32345</ns2:column>
                   <ns2:column xsi:type="xs:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">OPC</ns2:column>
                   <ns2:column xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
                   <ns2:column xsi:type="xs:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">QWE</ns2:column>
                </ns2:row>
                 .
                 .
                 .
             </ns3:value>
          </ns3:loadListResponse>
       </soapenv:Body>
    </soapenv:Envelope>
    

    我希望通过在顶部添加所需的名称空间并从每列中删除它们(通常每行大约有30列)来优化此XML响应。结果应该如下所示:

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:xs="http://www.w3.org/2001/XMLSchema">
       <soapenv:Body>
          <ns3:loadListResponse xmlns:ns3="http://example.com/test/service-types-1.0" 
          xmlns:ns2="http://example.com/lists/lists-types-1.0" >
             <ns3:value>
                <ns2:row>
                   <ns2:column xsi:type="xs:int" >12345</ns2:column>
                   <ns2:column xsi:type="xs:string" >XYZ</ns2:column>
                   <ns2:column xsi:nil="true" />
                   <ns2:column xsi:type="xs:string" >ABC</ns2:column>
                </ns2:row>
                <ns2:row>
                   <ns2:column xsi:type="xs:int" >32345</ns2:column>
                   <ns2:column xsi:type="xs:string" >OPC</ns2:column>
                   <ns2:column xsi:nil="true" />
                   <ns2:column xsi:type="xs:string" >QWE</ns2:column>
                </ns2:row>
                 .
                 .
                 .
             </ns3:value>
          </ns3:loadListResponse>
       </soapenv:Body>
    </soapenv:Envelope>
    

    你会怎么做?

    有没有办法告诉axis2或jaxws这样做?

    还是需要手动操作生成的XML?

    3 回复  |  直到 15 年前
        1
  •  3
  •   Jon Skeet    15 年前

    您是否考虑过以适当透明的方式压缩响应?这样做可能更容易,而且对所有重复的数据都非常有效。

        2
  •  1
  •   skaffman    15 年前

    如果您担心Web服务的传输和/或处理效率,则应考虑启用 Fast Infoset 以下内容:

    快速信息集(或FI)是 国际标准规定 XML的二进制编码格式 信息集(XML信息集)作为 XML文档的替代方案 格式。它的目标是提供更多 比 基于文本的XML格式。

    我们可以把fi看作gzip for xml, 尽管FI的目标是优化两者 文件大小和处理 性能,而gzip优化 只有大小。

    它对大容量Web服务的影响是巨大的,我现在尽可能地将其作为一个问题来使用。

    两者都支持 Axis2 JAX-WS .

        3
  •  0
  •   miku    15 年前

    A的例子 servlet compression filter 轴1。

    本指南介绍如何将SOAP压缩与ApacheAxis结合使用。请求和响应消息都被压缩。要压缩和解压缩客户端的SOAP消息,需要使用gzip的轴扩展。服务器端的对应项是servlet过滤器。