找出此Web服务失败的原因

时间:2018-11-01 23:46:25

标签: c# asp.net .net web-services wcf

我正在处理我的一个政府机构提供的电子文档的Web服务。 WSDL可以在这里找到:https://maullin.sii.cl/DTEWS/CrSeed.jws?WSDL

我尝试在http://www.soapclient.com/soaptest.html调用getSeed()方法(这是唯一相关的方法),以查看它是否确实有效。

我创建了一个 WCF服务库进行测试,但出现以下错误:

  

System.ServiceModel.FaultException:'org.xml.sax.SAXParseException:序言中不允许内容。'

快速的在线搜索显示许多用户在尝试实现此特定Web服务时遇到此问题,并且他们似乎都指出了一些Windows更新。每个人都指向另一个卸载对象,这就是其中一些人解决此问题的方式。

我不认为这是特定于Windows更新的问题,也许还有其他问题。因此,我改为尝试创建 WCF服务应用程序,并将Web服务托管在IIS中,以检查是否可能是调试问题。

在控制台项目中,我尝试调用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

有人可以测试吗? 谢谢。


编辑!:阅读我自己的答案...

1 个答案:

答案 0 :(得分:1)

好吧,最后这是一场噩梦。它涉及到首先禁用由 微软。详细信息:

https://support.microsoft.com/en-us/help/3155464/ms16-065-description-of-the-tls-ssl-protocol-information-disclosure-vu

我是通过编程实现的:

    AppContext.SetSwitch("TestSwitch.LocalAppContext.DisableCaching", true); 
    AppContext.SetSwitch("Switch.System.Net.DontEnableSchSendAuxRecord", true);

这样,我就可以克服org.xml.sax.SAXParseException了,这是WebServer做出的响应。即使当我使用自定义消息发送器更改原始消息时,它似乎也是WCF,甚至OS也在写一些字节或即时修改最终的SOAP消息。即时禁用该安全补丁可以阻止这种情况的发生。

现在,接下来要感谢自定义消息编码器,我可以看到Web服务最终返回了一条有效消息,但是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前缀的消息。

如果有人敢看这个,我会很高兴的,因为我认为这个解决方案有些古怪,老实说,我可以理解为什么人们更喜欢使用Java而不是WCF。