第一次调用.net Web服务很慢

时间:2013-04-18 14:42:27

标签: c# vb.net web-services .net-4.0 asmx

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

正在调用之前创建Web引用的实例,而不是延迟的一部分。

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

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

不确定接下来要检查什么。有什么想法吗?

5 个答案:

答案 0 :(得分:9)

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

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

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

<configuration>
    <system.net>
        <defaultProxy>
            <bypasslist>
                <add address="server/domain name" />
            </bypasslist>
        </defaultProxy>
    </system.net>
</configuration>

可在此处找到更多信息:<defaultProxy Element> on MSDN

答案 1 :(得分:2)

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

request.Proxy = new WebProxy(); 

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

<configuration >
  <system.net>
    <defaultProxy>
      <proxy bypassonlocal="true" usesystemdefault="false" />
    </defaultProxy>
</system.net>
</configuration>

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

答案 2 :(得分:0)

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

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


编辑:

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

答案 3 :(得分:0)

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

<强> bypassProxyOnLocal = “假”

<强> useDefaultWebProxy = “假”

希望这有帮助。

答案 4 :(得分:0)

为坏死添加道歉,但是这个问题对我来说已经出现了很多次,我习惯于每次都忘记该问题的所有方面。这是列表(其他人提到过)

  • 更改您的System.ServiceModel.BasicHttpBinding,以使 BypassProxyOnLocal和UseDefaultWebProxy均为false。 (您可以 确定是要在配置文件中还是通过代码来执行此操作。)
  • 在“构建”项目中更改“生成序列化程序集” 属性设置为“打开”,而不是“自动”
  • 确保您使用的是现代.NET框架。 4.6.1大约是60毫秒 例如,在第一个请求上比4.5.2快。
  • 不要在可执行文件上进行性能测试 VisualStudio(VS在初始阶段会增加很多额外的开销 实际发布的.exe版本中未反映的 调用。)
  • 如果您要使用持续运行的服务/网站, 绝对考虑在以下情况下向服务器发送虚拟请求 启动-只是为了让.NET预先序列化连接。 同样,如果您要编写运行退出应用程序,请考虑编写一个 程序启动时后台虚拟请求。
  • 确保所连接的服务不会非常回收 经常。每次应用程序池在IIS服务上回收时,第一个 回收后进入的请求可能需要一段时间。
  • 确保要连接的服务不会休眠。通过 默认情况下,服务在闲置20分钟后进入休眠状态- 下一个传入的请求具有类似于回收后的延迟 请求。