8

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

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

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

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

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

4

5 回答 5

9

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

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

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

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

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

于 2013-04-18T16:01:15.030 回答
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

于 2014-01-24T05:47:40.313 回答
1

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

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

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

bypassProxyOnLocal="假"

使用DefaultWebProxy="假"

希望这可以帮助。

于 2013-08-28T14:51:16.857 回答
0

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

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


编辑 :

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

于 2013-04-18T14:48:39.210 回答