第一次调用.net webservice很慢

我在我的.net winforms应用程序中调用.net webservice,两者都在框架4.0中。 在程序执行期间,webservice第一次调用方法时,调用大约需要10-12秒。 后续通话需要约1-2秒。 即使重新创建Web引用实例,后续调用仍然是〜1-2秒。 当winforms应用程序重新启动时,第一次呼叫延迟再次发生,但后续呼叫响应。

Web调用的实例是在调用发生之前创建的,并不是延迟的一部分。

正在生成winforms应用程序的XmlSerializers(并据我所知使用,但我不知道如何validation这一点)。

由于Web服务端的首次编译,因此不会发生延迟。 这是一整天都在使用的生产Web服务,其apppool仍保留在内存中。 据我所见,延迟发生在客户端,或者客户端和服务器之间的第一次调用,而不是后续调用。

不知道接下来要检查什么。 有任何想法吗?

正如消费者所指出的那样,问题与代理检测有关。 在Internet Explorer中关闭它解决了这个问题,但在我的情况下做不到办法。

相反,有一种解决方法可以绕过默认代理的使用,从而避免使用自动检测。

将这些条目添加到app.config允许某些URL绕过代理:

         

可在此处找到更多信息: MSDN上的

尝试将代理设置为空的WebProxy,即:

 request.Proxy = new WebProxy(); 

或者您可以使用system.net部分中的defaultProxy键覆盖应用程序的.Config文件中的代理设置。 以下禁用自动代理检测:

        

http://weblog.west-wind.com/posts/2005/Dec/14/Slow-Http-client-calls-from-ASPNET-20-Make-sure-you-check-your-Proxy-Settings

我多次遭遇这个问题 – 男人,我讨厌它! 大声笑虽然我从来没有最终解决它,你可以尝试一些事情。 首先,在启动过程中调用Web服务,首先让“痛苦”消失! 其次,尝试搞乱Web服务的IIS应用程序池 – 使其永远不会自行回收,或者至少在早上的非神圣时刻或者每10000个请求中进行回收。

我知道这可能不是一个很好的答案,但希望它有所帮助!


编辑:

部分问题是网络服务并非“永远” – 它会在需要之前进入睡眠,回收等状态。 值得一读的是保持网络服务的活力,5 9s的时间等等!

我在basicHttpBinding上添加了这些设置,禁用了自动代理检测,并在第一次执行时获得了很大的加速。 如果您进入Intranet环境,或者您根本不需要任何代理,这当然很有效。

bypassProxyOnLocal = “假”

useDefaultWebProxy = “假”

希望这可以帮助。

为死神添加道歉,但这个问题已经出现了很多次,我每次都习惯忘记这个问题的所有方面。 所以这是列表(其中一些人提到的)

  • 更改您的System.ServiceModel.BasicHttpBinding,以便BypassProxyOnLocal和UseDefaultWebProxy都为false。 (您可以决定是在配置文件中还是通过代码执行此操作。)
  • 将项目“Build”属性中的“Generate Serialization Assembly”更改为“On”而不是“Auto”
  • 确保您使用的是现代.NET框架。 例如,4.6.1在第一次请求时比4.5.2快约60 MS。
  • 在Release Executable上进行性能测试,而不是在VisualStudio中进行性能测试(VS在初始调用中增加了大量额外开销,而这些开销并没有反映在实际版本.exe版本中。)
  • 如果您正在使用不断运行的服务/站点,请务必考虑在启动时向服务器发送虚拟请求 – 只需让.NET预先序列化连接即可。 同样,如果您正在编写一个run-and-quit应用程序,请考虑在程序启动时编写后台虚拟请求。
  • 确保您连接的服务不经常回收。 每次应用程序池在IIS服务上回收时,回收后进入的第一个请求可能需要一段时间。
  • 确保您连接的服务没有hibernate。 默认情况下,服务在20分钟不活动后hibernate – 下一个请求进入的延迟类似于回收后请求。