SOAP请求在SOAPUI正常运行,C#调用导出过滤器报错问题排查
Enablon SOAP API ExportData 过滤器参数问题解决思路
问题回顾
在SOAPUI中可正常执行的ExportData请求,用C#自动生成的SOAP客户端调用时出现异常:
- 使用HTML转义等号
=作为Filter参数时,报错Unable To Apply Export Filter: Invalid Date: Missing closing "#" - 使用原始等号
=时,返回空结果,无匹配数据 - 必须使用过滤器避免数据量过大导致超时
解决思路
1. 对比SOAPUI与C#客户端的实际请求内容
通过抓包工具(如Fiddler、Wireshark)或启用C#客户端的SOAP日志,查看两者发送的XML请求中Filter参数的差异:
// 在C#代码中启用SOAP日志 srvEnablon.EnablonWS_Serv srv = new EnablonWS_Serv(); srv.Url = "https://www.aurl.com"; srv.TraceEnabled = true; srv.TraceListener = new System.Diagnostics.TextWriterTraceListener("soap_request.log");
重点确认Filter参数的转义状态、是否被额外处理,确保C#发送的格式与SOAPUI完全一致。
2. 尝试XML兼容的参数格式
- CDATA包裹Filter内容:部分SOAP服务对特殊字符的解析需要CDATA标记,避免自动转义:
Filter: "<![CDATA[id = 21662]]>" - 验证Filter语法规则:检查Enablon API文档,确认Filter是否需要单引号包裹值(如
id='21662')、是否支持特定运算符(如==)或自然语言表达式(如id equals 21662)。
3. 手动构造SOAP请求
如果自动生成的客户端存在参数转义问题,直接构造原始XML请求发送,完全控制请求内容:
var soapRequest = @"<?xml version=""1.0"" encoding=""utf-8""?> <soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/""> <soap:Header> <Security xmlns=""{你的Enablon命名空间}""> <UsernameToken> <Username>me@mymail.com</Username> <Password>blablabla</Password> </UsernameToken> </Security> </soap:Header> <soap:Body> <ExportData xmlns=""{你的Enablon命名空间}""> <Table>/ims/Incidents</Table> <FolderId>0</FolderId> <FormatType>3</FormatType> <Fields></Fields> <CSVSeparator>0</CSVSeparator> <FormatOptions>26</FormatOptions> <Filter>id = 21662</Filter> <ExportOptions>0</ExportOptions> </ExportData> </soap:Body> </soap:Envelope>"; var request = (HttpWebRequest)WebRequest.Create("https://www.aurl.com"); request.Method = "POST"; request.ContentType = "text/xml; charset=utf-8"; request.Headers.Add("SOAPAction", "{你的SOAP动作}"); using (var writer = new StreamWriter(request.GetRequestStream())) { writer.Write(soapRequest); } using (var response = (HttpWebResponse)request.GetResponse()) using (var reader = new StreamReader(response.GetResponseStream())) { var result = reader.ReadToEnd(); // 处理返回结果 }
注意替换{你的Enablon命名空间}和{你的SOAP动作}为SOAPUI请求中对应的内容。
4. 联系Enablon技术支持
如果上述方法均无效,直接提交问题给Enablon技术支持,提供SOAPUI的请求示例、C#的请求日志及错误信息,排查API的参数解析逻辑差异。
内容的提问来源于stack exchange,提问作者Panos Antoniou
相关产品推荐
相关产品推荐

