初始Web服务调用在.NET中需要很长时间

时间:2011-12-17 18:03:15

标签: c# wcf

我使用HTTPS在IIS中托管了WCF Web服务。服务和客户端应用程序都是用C#编写的。客户端应用程序进行的第一个Web服务调用需要15秒才能完成。一旦进行了初始调用,则子调用将在大约100毫秒内完成。为了测试,我有一个简单的方法:string Ping(int val);这简单地回传了作为字符串传入的数字。

奇怪的是,千里之外的用户报告了这个问题,但我没有在我的开发机器上遇到它。我只看到第一个请求需要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上重现这个问题。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

如果您在客户端中使用WCF代理,则生成代理管道所需的时间将使第一次调用比后续调用慢。有关详细信息,请参阅此article

答案 2 :(得分:0)

检查上一个问题的答案,它与asmx服务有关,但核心问题可能是相同的

ASMX Web Service slow first request