2011-12-17 54 views
3

我有一个使用HTTPS在IIS中托管的WCF Web服务。服务和客户端应用程序都是用C#编写的。客户端应用程序所做的第一个Web服务调用需要15秒钟才能完成。一旦完成最初的呼叫,后续呼叫在大约100毫秒内完成。为了测试,我有一个简单的方法:string Ping(int val);它只是回传以字符串形式传入的数字。.NET中的初始Web服务调用需要很长时间

奇怪的是,一个千里之外的用户报告了这个问题,但我没有在我的开发机器上遇到它。我只看到第一个请求需要2到3秒。现在几乎每个客户都报告第一个请求需要超过15秒。

这是C#客户端的正常行为吗?有没有人遇到过这个问题?

我的Web服务绑定配置如下:

<basicHttpBinding> 
    <binding 
    name="BasicHttpBinding_IMyWebSvc" 
    maxBufferSize="16777216" 
    maxReceivedMessageSize="16777216" 
    messageEncoding="Mtom"> 
    <readerQuotas 
     maxDepth="1024" 
     maxStringContentLength="262144" 
     maxArrayLength="16777216" 
     maxBytesPerRead="16777216" 
     maxNameTableCharCount="16777216" 
    /> 
    <security mode="Transport"> 
     <transport clientCredentialType="None"/> 
    </security> 
    </binding> 
</basicHttpBinding> 

编辑:这个问题会很奇怪。

我写了一个测试客户端,使用了除了Ping()测试方法之外什么都没有的修剪代理代码。经过测试,它仍然花费了15秒以上。由于Ping()函数不需要大量缓冲区并且问题消失,因此开始更改客户端缓冲区大小。将缓冲区大小恢复到其原始值,问题不再回来。冉真实的客户和第一个电话在1.2秒内完成。现在我无法在我的开发PC上重现问题。

+0

你用Wireshark来看看那里的延迟是从术语来的网络? – 2011-12-17 18:05:01

+0

我会试一试。 – 2011-12-17 18:12:17

+0

如果您能够从托管您的服务的网络外部进行连接,那可能会更好。我与Jon合作,我认为你遇到某种与网络有关的超时问题。 – 2011-12-17 18:25:13

回答

0

在IIS上托管.NET应用程序的问题是应用程序池预热时间。池被终止后(空闲时间或bin-files修改后),直到下一个请求才会被重新创建。您可以使用适用于IIS的IIS应用程序预热模块让您的应用程序池保持活动状态(可以使用Web平台安装程序进行安装)

+0

对于AppPool来说,15秒是很长时间的热身。 – 2011-12-17 18:09:30

+0

我以为可能是这样,但即使服务已经激活,延迟也会发生。 – 2011-12-17 18:11:20

+0

@ M.Babcock:是的。然而,运行在我的笔记本电脑上的简单的asp.net mvc应用程序需要约20秒才能启动并运行。 – Novakov 2011-12-17 18:12:48

0

如果您在客户端使用WCF代理,生成代理管道所需的时间将使第一次通话比后续通话慢。有关更多信息,请参见此article

+0

我正在使用.NET Framework 4并使用svcutil.exe生成代理。我会查看文章,看看有没有什么帮助。 – 2011-12-17 19:40:57

+0

我已经在做什么文章推荐,除了我用绑定和端点的构造函数。做了一个测试应用程序来使用没有参数的构造函数并获得相同的结果。 – 2011-12-17 23:37:27

0

检查此之前的问题的答案,是ASMX服务相关,但核心问题可能是相同

ASMX Web Service slow first request

+0

上述问题的所有答案似乎都是为了缩短服务启动时间。我已经证实问题出在客户端。 – 2011-12-18 22:40:11

相关问题