我正在处理来自我的一个政府机构的电子文档的网络服务。 WSDL可以在这里找到:https://maullin.sii.cl/DTEWS/CrSeed.jws?WSDL
我试着在getSeed()
上调用http://www.soapclient.com/soaptest.html方法(这是唯一相关的方法)来查看它是否正常工作,实际上它是。
我创建了一个WCF服务库来测试这个,我得到以下错误:
System.ServiceModel.FaultException:'org.xml.sax.SAXParseException:prolog中不允许使用内容。'
快速在线搜索显示许多用户在尝试实现此特定Web服务时遇到此问题,并且他们似乎都指出了一些Windows更新。每个人都指向另一个卸载,其中一些人解决了这个问题。
我不相信这是一个特定的Windows更新问题,也许还有别的东西。因此,我尝试创建WCF服务应用程序并在IIS中托管Web服务,以检查是否可能是某些调试问题。
在一个控制台项目中,我尝试调用getSeed()
方法,但它最终返回一个null
字符串而不是扔一个SAXParseException
。
那么这里的交易是什么?对我来说似乎很直接:
1. Add the service reference
2. Create a new instance of CrSeedClient class
3. Call getSeed() method.
为什么我在这个特定的Web服务上遇到了这些麻烦?
顺便说一句,我使用的是Net Framework 4.7.2 / Windows 10 / Visual Studio 2017
任何人都可以测试一下吗?谢谢。
编辑!:阅读我自己的答案......
好吧,最后这是一场噩梦。它涉及首先禁用微软制作的安全补丁。这里的细节:
我以编程方式制作:
AppContext.SetSwitch("TestSwitch.LocalAppContext.DisableCaching", true);
AppContext.SetSwitch("Switch.System.Net.DontEnableSchSendAuxRecord", true);
这样我就可以通过org.xml.sax.SAXParseException
,这是WebServer的回应。即使我使用自定义消息enconder更改了原始消息,它似乎是WCF,甚至可能是操作系统正在写入一些字节或动态修改最终的SOAP消息。即时禁用该安全补丁可防止这种情况发生。
现在接下来感谢自定义消息编码器,我可以看到webservice最终返回了一个有效的消息,但WCF没有正确解析它。经过几个小时的测试,我弄清楚了:
原始回复:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<getSeedResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<getSeedReturn xsi:type="xsd:string">
<?xml version="1.0" encoding="UTF-8"?><SII:RESPUESTA xmlns:SII="http://www.sii.cl/XMLSchema"><SII:RESP_BODY><SEMILLA>013052590000</SEMILLA></SII:RESP_BODY><SII:RESP_HDR><ESTADO>00</ESTADO></SII:RESP_HDR></SII:RESPUESTA>
</getSeedReturn>
</getSeedResponse>
</soapenv:Body>
</soapenv:Envelope>
通过删除任何地方的ns1
前缀(包括xmlns:ns1="http://DefaultNamespace"
),我终于可以得到正确的解析。
修好后:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<getSeedResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<getSeedReturn xsi:type="xsd:string">
<?xml version="1.0" encoding="UTF-8"?><SII:RESPUESTA xmlns:SII="http://www.sii.cl/XMLSchema"><SII:RESP_BODY><SEMILLA>013052590000</SEMILLA></SII:RESP_BODY><SII:RESP_HDR><ESTADO>00</ESTADO></SII:RESP_HDR></SII:RESPUESTA>
</getSeedReturn>
</getSeedResponse>
</soapenv:Body>
</soapenv:Envelope>
我仍然不理解安全补丁或WCF无法使用NS1前缀解析消息的原因。
如果有人敢看这个我会很高兴,因为我认为这个解决方案有点hacky,老实说,我可以看到为什么人们更喜欢使用java而不是WCF。