找出这个Web服务失败的原因

问题描述 投票:1回答:1

我正在处理来自我的一个政府机构的电子文档的网络服务。 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

任何人都可以测试一下吗?谢谢。


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

c# asp.net .net web-services wcf
1个回答
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的回应。即使我使用自定义消息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。

© www.soinside.com 2019 - 2024. All rights reserved.