WSO2 EI调用DSS报错:首元素需为Envelope但找到html
WSO2 EI调用DSS接口返回解析错误排查
问题描述
在WSO2 EI中通过select查询从DSS获取数据,使用Payload Factory完成报文转换后将报文发送至目标端点,执行时抛出错误:
First Element must contain the local name, Envelope , but found html
关联序列配置
<sequence name="ValidateRecordExistanceInDB" xmlns="http://ws.apache.org/ns/synapse"> <payloadFactory media-type="xml"> <format> <p:select_with_key_novum_extension_operation xmlns:p="novum.service"> <xs:Id xmlns:xs="novum.service">$1</xs:Id> </p:select_with_key_novum_extension_operation> </format> <args> <arg evaluator="xml" expression="get-property('Extension')" literal="false" xmlns:ns="http://org.apache.synapse/xsd"/> </args> </payloadFactory> <property name="REST_URL_POSTFIX" scope="axis2" type="STRING" value=""/> <property name="HTTP_METHOD" scope="axis2" type="STRING" value="POST"/> <property name="ContentType" scope="axis2" type="STRING" value="text/xml"/> <property name="Accept" scope="transport" type="STRING" value="text/xml"/> <property expression="$ctx:config//*[local-name()='localHost']" name="localHost" scope="default" type="STRING" xmlns:ns="http://org.apache.synapse/xsd"/> <header expression="concat($ctx:localHost, '/services/NovumAudioValidationDataRetrievalService')" name="To" scope="default" xmlns:ns="http://org.apache.synapse/xsd"/> <property name="SOAPAction" scope="transport" type="STRING" value="select_with_key_novum_extension"/> <call> <endpoint> <default format="soap11"> </default> </endpoint> </call> <filter xmlns:ds="novum.service" xmlns:ns="http://org.apache.synapse/xsd" xpath="boolean(//ds:novum_extensionCollection/ds:novum_extension)"> <then> <property expression="//*[local-name()='Department']" name="department"/> <property expression="//*[local-name()='Username']" name="username"/> <property expression="//*[local-name()='Extension']" name="extension"/> <property expression="//*[local-name()='Novum_Extension']" name="novumExtension"/> <property expression="//*[local-name()='email']" name="email"/> <property expression="//*[local-name()='location']" name="location"/> <property expression="//*[local-name()='selling_dealer__c']" name="selling_dealer__c"/> <log level="custom"> <property expression="concat('successfully retrieved record with extension ', $ctx:Rec_Id, ' from the db')" name="novum-api-status"/> <property expression="$ctx:department" name="department"/> <property expression="$ctx:location" name="location"/> <property expression="$ctx:username" name="username"/> <property expression="$ctx:email" name="notifierEmail"/> <property expression="$ctx:selling_dealer__c" name="selling_dealer__c"/> </log> </then> <else> <log level="custom"> <property expression="concat('record with extension ', $ctx:Rec_Id, ' not found in the db, sending out error email notification')" name="novum-api-status"/> </log> <property expression="concat('Record with Novum Extension ', $ctx:Rec_Id, ' can not be found in the database.')" name="errorMsg"/> <sequence key="NotifyErrorSubscribers"/> <drop/> </else> </filter>
错误根因
端点配置指定使用soap11格式解析响应,要求响应报文根节点必须为SOAP标准的Envelope节点,但实际DSS返回的是HTML格式内容(通常是服务错误页、404页、权限拦截页、服务异常默认页),导致SOAP解析失败抛出异常。
排查与修复方案
- 校验DSS服务地址有效性
直接通过接口测试工具调用拼接后的DSS地址(localHost配置值 +/services/NovumAudioValidationDataRetrievalService),确认返回内容格式:- 若返回404类HTML页:检查DSS服务是否成功部署、服务名拼写是否正确、
localHost配置的IP/端口是否和DSS实际监听地址一致 - 若返回401/403类HTML页:说明调用缺少认证信息,需要在请求头补充对应Authorization认证参数
- 若返回500类HTML页:说明DSS内部SQL查询执行失败,登录DSS节点查看后台日志定位SQL执行错误
- 若返回404类HTML页:检查DSS服务是否成功部署、服务名拼写是否正确、
- 修正Content-Type属性配置错误
现有配置中Content-Type的属性名拼写错误,WSO2 EI中指定请求Content-Type的axis2属性名为CONTENT_TYPE,错误的属性名会导致请求头不符合DSS要求触发错误返回,替换原有配置为:<property name="CONTENT_TYPE" scope="axis2" type="STRING" value="text/xml;charset=UTF-8"/> - 校验SOAPAction配置匹配性
现有配置的SOAPAction值为select_with_key_novum_extension,需要和DSS服务定义中对应操作的SOAPAction完全一致,部分DSS版本要求SOAPAction携带服务命名空间,格式参考novum.service/select_with_key_novum_extension,SOAPAction不匹配会导致DSS返回操作不支持的错误页。 - 快速定位调试方法
在<call>中介器之后新增全量日志打印配置,直接输出DSS返回的完整HTML内容,可快速定位具体错误原因:<log level="full"/>
参考截图
内容的提问来源于stack exchange,提问作者Thamu
相关产品推荐
相关产品推荐

