使用.NET服务引用调用Web服务的开销是多少?

时间:2013-07-02 13:33:19

标签: .net web-services service-reference

我正在使用来自第三方的网络服务。我正在测量调用Web方法和计时网络流量所需的时间。我发现呼叫所需的时间比网络流量长得多。

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

这是我用来衡量网络方法调用时间的代码

  Dim service As New SupplementaryEnquiryV1PortTypeClient()

    Dim _stopWatch As New Stopwatch()

    _stopWatch.Start()

    response = service.Enquiry(request)

    _stopWatch.Stop()

客户端是用VB .NET编写的,Framework 4.5版

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

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

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

我已经尝试将System.ServiceModel.ClientBase(Of T)上的CacheSetting属性设置为AlwaysOff和AlwaysOn,但两者没有任何区别。我也尝试为项目设置“生成序列化程序集”为On。

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

来自Fiddler:

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

修改

正如我们所建议的那样,我已经将代码放在了一个分析器中。我在2012年使用了内置的(见下文)。看起来像Microsoft.Xml.Serialization.ArrayOfObjectsSerializer1.Deserialize占用了大量的时间。什么可能导致这需要几秒钟?

Profile Summary

2 个答案:

答案 0 :(得分:2)

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

this.webRequest.UseNagleAlgorithm.ServicePoint = false;

此外,Expect100Continue'握手'与肥皂服务呼叫性能相关:

this.webRequest.Expect100Continue.ServicePoint = false;

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

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

答案 1 :(得分: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>

另请参阅herehere或仅查看Google system.net connectionmanagement maxconnection,并查看结果。

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

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