C# 在.NET中,初始web服务调用需要很长时间

C# 在.NET中,初始web服务调用需要很长时间,c#,wcf,C#,Wcf,我在IIS中使用HTTPS托管了一个WCF web服务。服务和客户端应用程序都是用C#编写的。客户端应用程序进行的第一次web服务调用需要超过15秒才能完成。初始调用完成后,子Qent调用将在大约100毫秒内完成。对于测试,我有一个简单的方法:字符串Ping(intval);它只是回显作为字符串传入的数字 奇怪的是,千里之外的一个用户报告了这个问题,但我在我的开发机器上没有遇到这个问题。我只看到第一个请求需要2到3秒钟。现在几乎每个客户端都报告第一个请求需要15秒以上 这是C#客户的正常行为吗?

我在IIS中使用HTTPS托管了一个WCF web服务。服务和客户端应用程序都是用C#编写的。客户端应用程序进行的第一次web服务调用需要超过15秒才能完成。初始调用完成后,子Qent调用将在大约100毫秒内完成。对于测试,我有一个简单的方法:字符串Ping(intval);它只是回显作为字符串传入的数字

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

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

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

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


您是否使用Wireshark查看网络延迟的来源?如果您能够从承载服务的网络外部使用Wireshark,可能会更好。我和Jon在一起,我想你遇到了一些与网络相关的超时问题。根据Wireshark的说法,在发出请求后的14秒钟内,没有数据包离开客户端。我的开发客户端是一台高端PC,专为游戏设计。我将调查客户端构建过程中发生的情况。15秒对于AppPool预热来说是一段很长的时间。我认为可能是这样,但即使服务已经处于活动状态,延迟也会发生。@M.Babcock:是的,是的。然而,在我的笔记本电脑上运行的简单asp.net mvc应用程序需要大约20秒才能启动和运行。我同意M.Babcock的观点。15秒相当长。20秒对于一个玩具项目来说是非常长的(假设你的硬件是半个像样的)。我正在使用.NET Framework 4并使用svcuti.exe生成代理。我将查看这篇文章,看看是否有什么帮助。我已经在做文章推荐的事情了,除了我使用了带绑定和端点的构造函数。制作了一个测试应用程序,使用无参数的构造函数并得到相同的结果。上述问题的所有答案似乎都是为了缩短服务启动时间。我已经证实问题出在客户端。