【问题标题】:First call to a .net webservice is slow第一次调用 .net 网络服务很慢
【发布时间】:2013-04-18 14:42:27
【问题描述】:

我正在从我的 .net winforms 应用程序中调用 .net webservice,两者都在框架 4.0 中。在程序执行期间,webservice 第一次调用方法时,调用大约需要 10-12 秒。随后的调用大约需要 1-2 秒。后续调用,即使重新创建了 Web 引用实例,仍然需要大约 1-2 秒。 winforms应用重启后,第一次调用延迟再次出现,但后续调用有响应。

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

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

由于 web 服务端的首次运行编译,没有发生延迟。这是一个全天都在使用的生产网络服务,它的应用程序池保留在内存中。据我所知,延迟发生在客户端或客户端和服务器之间的第一次调用,但不是后续调用。

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

【问题讨论】:

  • 请记住,第一次调用会比较慢,但是,它不应该那么慢。
  • 我怀疑答案可能在这个问题/答案组合中的某个地方:stackoverflow.com/questions/6988981/webclient-is-very-slow 特别是,我正在研究代理问题。
  • 在故障机器的 Internet 选项中,您的代理是否有“自动检测设置”?
  • @tkcsam:是的,我预计会有少量延迟,但肯定不是我所看到的。
  • @spender:我去看看。

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


【解决方案1】:

正如 spender 所指出的,问题与代理检测有关。在 Internet Explorer 中关闭它可以解决问题,但在我的情况下不可行。

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

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

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

更多信息可以在这里找到:<defaultProxy Element> on MSDN

【讨论】:

  • 您有在桌面上运行的 winforms 客户端应用程序,并且更改 Internet Explorer 选项对此有帮助吗?只是古玩,请告诉我!
  • @MareInfinitus:它本身并不是一个真正的 Internet Explorer 选项,它是 wininet API 的一个选项,Internet Explorer 也使用它并提供一个用于配置的 GUI。
【解决方案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

【讨论】:

    【解决方案3】:

    为 necro-add 道歉,但是这个问题对我来说已经出现了很多次,而且我有一个习惯,每次都会忘记这个问题的所有方面。所以这里是列表(其他人提到的一些)

    • 更改您的 System.ServiceModel.BasicHttpBinding 以便 BypassProxyOnLocal 和 UseDefaultWebProxy 都是假的。 (你可以 决定是否要在配置文件中或通过代码执行此操作。)
    • 更改项目“构建”中的“生成序列化程序集” 属性设置为“开”而不是“自动”
    • 确保您使用的是现代 .NET 框架。 4.6.1 约为 60 MS 例如,在第一次请求时比 4.5.2 快。
    • 对发布可执行文件进行性能测试,而不是在其中 VisualStudio(VS 在最初的 没有反映在实际版本 .exe 构建中的调用。)
    • 如果您正在使用持续运行的服务/站点, 绝对考虑向服务器发送一个虚拟请求 启动 - 只是为了让 .NET 预先序列化连接。 同样,如果您正在编写一个运行和退出应用程序,请考虑编写一个 程序启动时的后台虚拟请求。
    • 确保您所连接的服务不会循环使用 经常。每次应用程序池在 IIS 服务上回收时,第一个 回收后的请求可能需要一段时间。
    • 确保您连接的服务没有休眠。经过 默认情况下,服务在 20 分钟不活动后休眠 - 和 下一个进来的请求有一个类似于 post-recycle 的延迟 请求。

    【讨论】:

      【解决方案4】:

      我多次遇到这个问题 - 我讨厌它!大声笑虽然我从未最终解决它,但您可以尝试一些事情。首先,在启动过程中调用 Web 服务,并首先消除“痛苦”!其次,尝试弄乱 Web 服务的 IIS 应用程序池 - 使其永远不会自行回收,或者至少在早上的非上帝时刻或每 10000 个请求时这样做。

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


      编辑:

      问题的一部分是 Web 服务并非“始终”启动 - 它会进入休眠状态、回收等,直到需要。值得一读的是保持网络服务的活力、5 个 9 的正常运行时间等!

      【讨论】:

      • 无济于事。 OP 在问题中勾选了这些问题。
      • 正确。 Apppool 与此处无关。但感谢您的建议
      • 这个网络服务,在我的测试期间,确实“总是”在运行。从早上 7 点到晚上 7 点左右,客户端每秒调用 2-3 次。我理解您所说的关于应用程序池回收等方面的内容,但此处并非如此。
      • 很公平 - 只是覆盖基地!我解决这个问题的唯一方法是在我的客户启动时对服务进行初始虚拟调用。抱歉,目前无法提供更多帮助!
      • 那么我认为当前调用该服务的客户端是 Web 客户端,而您的问题来自使用 Web 服务引用向导的 .Net 应用程序是正确的吗?
      【解决方案5】:

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

      bypassProxyOnLocal="false"

      useDefaultWebProxy="false"

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-23
        • 2012-02-17
        • 1970-01-01
        相关资源
        最近更新 更多