Sabre GetElectronicDocumentRQ请求报错:Unable to create envelope from given source
Sabre GetElectronicDocumentRQ请求报错:Unable to create envelope from given source
嘿,我来帮你捋捋这个问题!既然你说Postman里的请求能正常跑,但C#代码一调用就报Unable to create envelope from given source,那基本可以锁定是你的C#请求里的SOAP信封格式或者请求内容出了问题——毕竟Sabre的SOAP接口对格式的严谨性要求可是很高的。
给你几个排查方向,你可以挨个试试:
- 对比Postman和C#的SOAP信封格式:把Postman里能跑通的原始SOAP XML完整复制出来,和C#代码里构造的请求Body逐行对比。重点看有没有遗漏命名空间、根节点是否正确、标签有没有闭合错误,比如
GetElectronicDocumentRQ对应的命名空间是不是Sabre要求的那一个,少了这个的话,接口根本没法识别你的信封结构。 - 检查Content-Type请求头是否正确:SOAP接口对这个头的要求很严格,一般分两种:
text/xml;charset=utf-8对应SOAP 1.1,application/soap+xml;charset=utf-8对应SOAP 1.2。你在Postman里肯定是设置对了,那一定要确保C#代码里的请求头和Postman完全一致,比如用StringContent的时候要指定正确的媒体类型:
编码也别忘了设成UTF-8,不然容易出现乱码导致XML解析失败。request.Content = new StringContent(你的SOAP XML内容, Encoding.UTF8, "text/xml"); - 别手动拼接XML字符串!:如果你的C#代码是用字符串拼接的方式生成SOAP Body,那大概率会出现特殊字符转义错误,比如引号、尖括号没处理好,直接导致XML格式不合法。建议用XML序列化的方式来生成请求体,比如用
XmlSerializer把你的请求对象序列化成XML,这样能自动处理格式和转义问题,比手动拼靠谱多了。 - 确认安全凭证的嵌入方式:Sabre的接口需要在SOAP信封的Header里放身份验证信息,比如Token或者UsernameToken。你要确保C#代码里的这部分和Postman里的完全一致,包括标签的命名空间、结构,别漏了任何一个节点,不然接口不仅会认不出你的信封,还可能直接拒绝请求。
备注:内容来源于stack exchange,提问作者Heemanshu Bhalla
相关产品推荐
相关产品推荐

