强制 Soap/WCF 使用 HTTP 而不是 TCP 协议
Posted
技术标签:
【中文标题】强制 Soap/WCF 使用 HTTP 而不是 TCP 协议【英文标题】:Force Soap/WCF to use HTTP not TCP protocol 【发布时间】:2020-12-18 23:07:31 【问题描述】:我有一个客户端使用 2 个 Web/WCF 服务,它们都是 SOAP 类型。让我们称它们为 ServiceA 和 ServiceB。 ServiceA 工作正常,但 ServiceB 不太好:我收到错误消息,指出响应消息中的 CData(文本数据)在接收来自 ServiceB 的响应时在 XML 解析器/反序列化器中创建故障。 (我怀疑 CData 可能包含来自 ServiceB 的错误消息)。
现在,我安装了 WireShark 来调查发送和接收的原始数据。 Wireshark 提供了有关正在工作的 ServiceA 连接的非常好的信息:使用 HTTP 协议传输数据(顶部使用 TLS 1.2 以确保其安全),我可以很好地看到请求和响应。
但是,对于与另一个 ServiceB 的麻烦连接,所有连接都使用 TCP,而不是 HTTP。 TCP 消息的消息内容在 WireShark 中不可读。
-
首先:为什么 ServiceB 使用 TCP 而不是 HTTP? (在我的客户端代码中,Bindings 和 Endpoints 非常相似,都使用“basicHttpsBinding”)。
是否可以强制 ServiceB SOAP 消息通过 HTTP 而不是 TCP,从而使 WireShark 输出可读?
非常感谢任何cmets。
【问题讨论】:
BasicHttpsBinding 使用http进行传输。如果可以的话,能否提供一些配置信息? 【参考方案1】:对于那些阅读以上帖子的人:
原来我的客户端和 ServiceB 之间有一个中间代理。 似乎这个代理(对我来说,令人惊讶)执行 XML 反序列化。如果代理尝试反序列化来自 ServerB 的异常,则代理会抛出令人讨厌的“无法反序列化 CData”,并将其传递给客户端。导致客户(我)很困惑。
(是的,教训是任何服务都不能抛出异常。必须捕获、处理所有异常,并且必须将预定义字段中的受控错误提供给调用者)。
【讨论】:
以上是关于强制 Soap/WCF 使用 HTTP 而不是 TCP 协议的主要内容,如果未能解决你的问题,请参考以下文章
如何强制客户端使用 http/2? (而不是回退到 http 1.1)
如何强制 window.location 发出 HTTP 请求而不是使用缓存?
如何强制我的本地 Azure 函数服务器使用 HTTP 2.0 而不是 1.1?