8

我正在使用在 VS2008 .Net 3.5 中生成的传统 C# Web 服务客户端,继承自 SoapHttpClientProtocol。这是连接到用 Java 编写的远程 Web 服务。

所有配置都是在客户端初始化期间在代码中完成的,如下所示:

        ServicePointManager.Expect100Continue = false;
        ServicePointManager.DefaultConnectionLimit = 10;

        var client = new APIService
        {
            EnableDecompression = true,
            Url = _url + "?guid=" + Guid.NewGuid(),
            Credentials = new NetworkCredential(user, password, null),
            PreAuthenticate = true,
            Timeout = 5000 // 5 sec
        };

一切正常,但是执行最简单的方法调用所花费的时间几乎是网络 ping 时间的两倍。而 Java 测试客户端与网络 ping 时间大致相同:

C# client ~ 550ms
Java client ~ 340ms
Network ping ~ 300ms

在分析会话的 TCP 流量后发现以下内容:

基本上,C# 客户端按以下顺序发送 TCP 数据包。

Client Send HTTP Headers in one packet.
Client Waits For TCP ACK from server.
Client Sends HTTP Body in one packet.
Client Waits For TCP ACK from server.

Java 客户端按以下顺序发送 TCP 数据包。

Client Sends HTTP Headers in one packet.
Client Sends HTTP Body in one packet.
Client Revieves ACK for first packet.
Client Revieves ACK for second packet.
Client Revieves ACK for second packet.

无论如何配置 C# Web 服务客户端以在 Java 客户端出现时并行发送标头/正文?

非常感谢任何帮助或指示。

4

2 回答 2

1

感谢 Rob 的回复,最终我选择使用 Add Service Reference / WCF 代理生成,默认情况下会这样做。可能是因为它在下面使用了较新的 HTTP 库。

对于返回复杂对象的原始数组的 SOAP 方法,我确实遇到了一些 WCF 代理生成问题(即:返回一个包含对象数组的对象工作正常)。为了解决这个问题,您要么必须将数组包装在对象中,要么将 SOAP 服务器配置从 RPC 切换到 DOCUMENT(这就是我们所做的)。

于 2010-04-29T09:04:47.393 回答
0

我认为您可以使用继承的EndGetRequestStream方法来破解 SoapHttpClientProtocol。将其保存到缓冲区,直到请求完成。然后制作自己的流并立即将其全部推出。

于 2010-04-28T05:02:53.643 回答