3

我正在使用第三方的 Web 服务。我正在测量调用 Web 方法和定时网络流量所需的时间。我发现通话花费的时间比网络流量要长得多。

我运行应用程序并使用 fiddler 观察流量,打开 HTTP CONNECT 隧道需要 46 毫秒,发送数据需要 951 毫秒。我预计这个总数约为 1000 毫秒,但它的输出时间为 1504 毫秒。500 毫秒可能看起来不多,但这是从测试服务器完成的,从我们经常看到的实时服务器的响应时间为 6 秒,对于需要 1 秒的网络调用。

这是我用来测量 Web 方法调用时间的代码

  Dim service As New SupplementaryEnquiryV1PortTypeClient()

    Dim _stopWatch As New Stopwatch()

    _stopWatch.Start()

    response = service.Enquiry(request)

    _stopWatch.Stop()

客户端用VB .NET编写,框架版本4.5

客户端是通过在 Visual Studio 中添加服务引用生成的,我也尝试使用 svcutil.exe 生成服务引用。

我相信 Web 服务是用 Java 编写的,但我无法访问代码。该服务返回有关单个车辆的数据,我假设这些数据是从数据库中提取的。

我尝试使用不使用 SSL 的服务端点,这没有任何区别。

我尝试将 System.ServiceModel.ClientBase(Of T) 上的 CacheSetting 属性设置为 AlwaysOff 和 A​​lwaysOn,但都没有任何区别。我还尝试将项目的“生成序列化程序集”设置为 On。

我使用 traceroute 检查任何与网络相关的问题。

从提琴手:

CONNECT uat-wss.xxx.co.uk:443 HTTP/1.1

ClientConnected: 15:23:20.011
ClientBeginRequest: 15:23:20.027
GotRequestHeaders: 15:23:20.027
ClientDoneRequest: 15:23:20.027
Determine Gateway: 0ms
DNS Lookup: 29ms
TCP/IP Connect: 18ms
HTTPS Handshake: 20ms
ServerConnected: 15:23:20.074
FiddlerBeginRequest: 15:23:20.074
ServerGotRequest: 15:23:20.074
ServerBeginResponse: 00:00:00.000
GotResponseHeaders: 00:00:00.000
ServerDoneResponse: 00:00:00.000
ClientBeginResponse: 15:23:20.074
ClientDoneResponse: 15:23:20.074

Overall Elapsed: 0:00:00.046

POST /TradeSoap/services/SupplementaryEnquiryV1/ HTTP/1.1

ClientConnected: 15:23:20.011
ClientBeginRequest: 15:23:20.105
GotRequestHeaders: 15:23:20.105
ClientDoneRequest: 15:23:20.464
Determine Gateway: 0ms
DNS Lookup: 0ms
TCP/IP Connect: 0ms
HTTPS Handshake: 0ms
ServerConnected: 15:23:20.074
FiddlerBeginRequest: 15:23:20.464
ServerGotRequest: 15:23:20.464
ServerBeginResponse: 15:23:20.479
GotResponseHeaders: 15:23:20.994
ServerDoneResponse: 15:23:21.041
ClientBeginResponse: 15:23:21.041
ClientDoneResponse: 15:23:21.057

Overall Elapsed: 0:00:00.951

编辑

正如 usr 所建议的,我已将代码放入探查器。我在 2012 年使用过内置的(见下文)。看起来 Microsoft.Xml.Serialization.ArrayOfObjectsSerializer1.Deserialize 占用了大量时间。什么可能导致这需要几秒钟?

资料概要

4

2 回答 2

2

您可能正在见证 Nagle 算法的效果,请尝试:

this.webRequest.UseNagleAlgorithm.ServicePoint = false;

此外,Expect100Continue 'handshake' 与肥皂服务调用性能相关:

this.webRequest.Expect100Continue.ServicePoint = false;

Nagle 将在短时间内停止发送网络数据包,以尝试发送更少但更大的数据包。在通过公共互联网进行通信时,使用它可能是一个礼仪问题。做你自己的研究。

Expect100Continue 将阻止在初始 HTTP PUT/POST 上发送 SOAP 请求 XML,服务器将发送 OK/CONTINUE,然后客户端将发送 SOAP 请求 XML。这种额外的握手(两次完整的往返一次)也将引入延迟。

于 2013-07-10T13:06:09.127 回答
1

您可能会因为您的客户端(VB.Net 应用程序)未打开超过两个服务的并发连接而感到痛苦。

例如,如果您有 10 个并发请求page.aspx,并且此页面对每个请求执行一次服务调用,那么您基本上需要 10 个并发 Web 服务调用。

但是默认情况下,Asp.Net 将对同一目标的并发 http 调用数限制为两个。所以在这个假设的情况下,10 个页面请求中有两个会主动调用服务,另外 8 个会等待轮到它们。当前两个完成后,两个新的将调用该服务,依此类推。

您可以使用以下web.config设置来控制它:

<system.net>
    <connectionManagement>
        <add address="http://address.of.service/here" maxconnection="10"/>
    </connectionManagement>
</system.net>

另请参阅此处此处或仅在 Google 上查看system.net connectionmanagement maxconnection并查看结果。

请注意,通过显着增加此数字,您将对第三方服务施加更大的压力......

另请注意,更改maxconnection不会提高任何单个服务调用的性能,但它可能会提高生产环境中的性能,因为到 VB.Net 站点的传入流量较重,更可能需要对服务进行许多并发调用。

于 2013-07-10T11:56:08.477 回答