我正在使用来自第三方的网络服务。我正在测量调用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占用了大量的时间。什么可能导致这需要几秒钟?
答案 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>
另请参阅here,here或仅查看Google system.net connectionmanagement maxconnection
,并查看结果。
请注意,通过大幅增加此数字,您将对第三方服务施加更大压力......
另请注意,更改maxconnection
不会提高任何单个服务调用的性能,但它可能会提高生产环境中的性能,因为需要对服务进行多次并发调用更可能是由于较重的传入流量到VB.Net网站。