从 Sonic ESB 调用 WCF 服务时出现错误 404
Error 404 calling WCF Service from Sonic ESB
我们有一个运行良好的 WCF 服务,有 4 个客户使用此服务没有问题,但我有一个客户抱怨他最近几天无法再调用网络服务。
10 月以来我们没有改变任何东西,他也声称他没有改变任何东西。
正如我所说,我有其他客户使用此服务,而且我们也可以从 SOAP UI 调用该服务。我们甚至尝试在 AWS 中创建一个新的隔离机器并调用该服务,以确保它不会像防火墙问题那样阻止我们网络外部的通信。
从他发给我的堆栈跟踪中可以看出,该客户使用 Sonic ESB 调用我们的服务。我真的不明白 Sonic ESB 是如何工作的,但我的猜测是错误是由 Sonic ESB 引起的,而不是我的服务。这就像在他的应用程序和我的服务之间创建了一个 "adapter"。
这让我得出以下结论:
1) 查看他的请求XML(他发给我的)我可以看到它与我提供的WSDL不匹配,例如:
(出于显而易见的原因,我更改了一些名称和值)
<CreateOrderGatewayCompanyName> --> This would be just CreateOrderGateway
<header> --> this header seems specific to Sonic ESB, nothing to do with us
<user>123414714</user>
<idProcess>5411251</idProcess>
<channel>EB</channel>
<ip>[ip number here]</ip>
<sessionId>1fd5a3f4d8f4dsa5f4dsaf4dsf1da5.xyz</sessionId>
</header>
<body>
<idCampania>xyz</idCampania> --> This would be "CampaignId"
...
<order>
...
<fecha>2016-12-21</fecha> --> This would be "Date"
...
</order>
</body>
</CreateOrderGatewayCompanyName>
所以我只能得出结论,在这个过程中的某个地方,ESB 会将这个奇怪的 XML 转换为我的服务期望的正确 SOAP 请求格式。
2) 查看他发给我的异常堆栈跟踪,我可以看到这个 404 错误:
<?xml version="1.0" encoding="UTF-8"?>
<exception xmlns="http://www.sonicsw.com/sonicesb/exception">
<message>Exception while retrieving soap envelope from response:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Not Found</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Not Found</h2>
<hr><p>HTTP Error 404. The requested resource is not found.</p>
</BODY></HTML>
</message>
<class>com.sonicsw.xqimpl.invkimpl.wsif.providers.axissoap.SoapProviderInvocationException</class>
<detail/>
<stackTrace><![CDATA[org.xml.sax.SAXParseException: White spaces are required between publicId and systemId.
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
...
事情是这样的,他作为响应收到的这个 404 HTML 代码不是来自我的服务器,因为我们使用 IIS 8.5 并且 IIS 的 404 错误页面看起来不像这个, HTML 不同,消息也不同。它会是这样的:
“404 - 找不到文件或目录。
您要查找的资源可能已被删除,名称已更改,..”
那么有人知道这个 Sonic ESB 是否真的在应用程序中间创建了一个适配器或代理吗?如果有人已经遇到过这样的错误,原因是什么?我 100% 肯定我的服务工作正常。
您的客户是否发送了正在发送的实际 soap 请求?
他可以启用实际的 Web 服务调用(最简单的方法是从管理控制台执行此操作)。
http://knowledgebase.progress.com/articles/Article/S6498
知道发送的确切 soap 请求后,调试起来会更容易。
另外,我建议您在服务器测试时启用几分钟的请求跟踪,以丢弃在中间完成的任何其他修改。
事实证明,我服务器上的网络跟踪 (wireshark) 显示我客户的代理正在修改请求的 "Host",而不是
主持人:ourdomain.com
修改为
主机:proxy.customer.com:8080
因此,当此请求到达 IIS 服务器时,绑定配置为 "ourdomain.com",然后它丢弃了请求。出于某种奇怪的原因,一个名叫 "Microsoft HTTPAPI" 的人返回了我的客户在他们的应用程序上收到的 404 错误页面的回复。
所以我们已经解决了更改 IIS 绑定的问题,因为我不想等待我的客户调查他的代理到底在用主机名做什么。
我们有一个运行良好的 WCF 服务,有 4 个客户使用此服务没有问题,但我有一个客户抱怨他最近几天无法再调用网络服务。
10 月以来我们没有改变任何东西,他也声称他没有改变任何东西。
正如我所说,我有其他客户使用此服务,而且我们也可以从 SOAP UI 调用该服务。我们甚至尝试在 AWS 中创建一个新的隔离机器并调用该服务,以确保它不会像防火墙问题那样阻止我们网络外部的通信。
从他发给我的堆栈跟踪中可以看出,该客户使用 Sonic ESB 调用我们的服务。我真的不明白 Sonic ESB 是如何工作的,但我的猜测是错误是由 Sonic ESB 引起的,而不是我的服务。这就像在他的应用程序和我的服务之间创建了一个 "adapter"。
这让我得出以下结论:
1) 查看他的请求XML(他发给我的)我可以看到它与我提供的WSDL不匹配,例如:
(出于显而易见的原因,我更改了一些名称和值)
<CreateOrderGatewayCompanyName> --> This would be just CreateOrderGateway
<header> --> this header seems specific to Sonic ESB, nothing to do with us
<user>123414714</user>
<idProcess>5411251</idProcess>
<channel>EB</channel>
<ip>[ip number here]</ip>
<sessionId>1fd5a3f4d8f4dsa5f4dsaf4dsf1da5.xyz</sessionId>
</header>
<body>
<idCampania>xyz</idCampania> --> This would be "CampaignId"
...
<order>
...
<fecha>2016-12-21</fecha> --> This would be "Date"
...
</order>
</body>
</CreateOrderGatewayCompanyName>
所以我只能得出结论,在这个过程中的某个地方,ESB 会将这个奇怪的 XML 转换为我的服务期望的正确 SOAP 请求格式。
2) 查看他发给我的异常堆栈跟踪,我可以看到这个 404 错误:
<?xml version="1.0" encoding="UTF-8"?>
<exception xmlns="http://www.sonicsw.com/sonicesb/exception">
<message>Exception while retrieving soap envelope from response:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Not Found</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Not Found</h2>
<hr><p>HTTP Error 404. The requested resource is not found.</p>
</BODY></HTML>
</message>
<class>com.sonicsw.xqimpl.invkimpl.wsif.providers.axissoap.SoapProviderInvocationException</class>
<detail/>
<stackTrace><![CDATA[org.xml.sax.SAXParseException: White spaces are required between publicId and systemId.
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
...
事情是这样的,他作为响应收到的这个 404 HTML 代码不是来自我的服务器,因为我们使用 IIS 8.5 并且 IIS 的 404 错误页面看起来不像这个, HTML 不同,消息也不同。它会是这样的:
“404 - 找不到文件或目录。 您要查找的资源可能已被删除,名称已更改,..”
那么有人知道这个 Sonic ESB 是否真的在应用程序中间创建了一个适配器或代理吗?如果有人已经遇到过这样的错误,原因是什么?我 100% 肯定我的服务工作正常。
您的客户是否发送了正在发送的实际 soap 请求? 他可以启用实际的 Web 服务调用(最简单的方法是从管理控制台执行此操作)。
http://knowledgebase.progress.com/articles/Article/S6498
知道发送的确切 soap 请求后,调试起来会更容易。
另外,我建议您在服务器测试时启用几分钟的请求跟踪,以丢弃在中间完成的任何其他修改。
事实证明,我服务器上的网络跟踪 (wireshark) 显示我客户的代理正在修改请求的 "Host",而不是
主持人:ourdomain.com
修改为
主机:proxy.customer.com:8080
因此,当此请求到达 IIS 服务器时,绑定配置为 "ourdomain.com",然后它丢弃了请求。出于某种奇怪的原因,一个名叫 "Microsoft HTTPAPI" 的人返回了我的客户在他们的应用程序上收到的 404 错误页面的回复。
所以我们已经解决了更改 IIS 绑定的问题,因为我不想等待我的客户调查他的代理到底在用主机名做什么。