第一次调用.net web服务很慢
本文关键字:服务 web 调用 net 第一次 | 更新日期: 2023-09-27 18:10:04
我从我的。net winforms应用程序调用。net webservice,都在框架4.0中。在程序执行期间,webservice第一次调用一个方法时,调用需要10-12秒。后续呼叫大约需要1-2秒。随后的调用,即使在重新创建web引用实例时,仍然需要1-2秒。当winforms应用程序重新启动时,第一次调用延迟再次发生,但随后的调用响应。
web引用的实例在调用发生之前被创建,并且不属于延迟的一部分。
winforms应用程序的xmlserializer正在生成(和使用,据我所知,但我不确定如何验证这一点)。
延迟没有发生,因为在web服务端第一次运行编译。这是一个全天都在使用的生产web服务,它的appool保存在内存中。据我所知,延迟要么发生在客户端,要么发生在第一次调用的客户端和服务器之间,而不是随后的调用。
不知道下一步检查什么。什么好主意吗?
正如spender所指出的,这个问题与代理检测有关。在ie浏览器中关闭该功能可以解决这个问题,但在我的情况下不可行。
相反,有一个解决方法可以绕过默认代理的使用,从而绕过自动检测。
将这些条目添加到app.config中允许某些url绕过代理:
<configuration>
<system.net>
<defaultProxy>
<bypasslist>
<add address="server/domain name" />
</bypasslist>
</defaultProxy>
</system.net>
</configuration>
更多信息可以在这里找到: 尝试将代理设置为空WebProxy,即: 或者您可以使用system.net部分中的defaultProxy密钥覆盖应用程序的. config文件中的代理设置。以下命令禁用自动代理检测:request.Proxy = new WebProxy();
http://weblog.west-wind.com/posts/2005/Dec/14/Slow-Http-client-calls-from-ASPNET-20-Make-sure-you-check-your-Proxy-Settings <configuration >
<system.net>
<defaultProxy>
<proxy bypassonlocal="true" usesystemdefault="false" />
</defaultProxy>
</system.net>
</configuration>
为necro-add道歉,但这个问题对我来说已经出现了很多次,我有一个习惯,每次都忘记这个问题的所有方面。下面是列表(有些人提到过)
- 修改System.ServiceModel.BasicHttpBinding,以便BypassProxyOnLocal和UseDefaultWebProxy都是false。(你可以决定你是想在配置文件中还是通过代码来完成。)
- 更改项目"构建"中的"生成序列化程序集" 设置为"On"而不是"Auto"确保你使用的是一个现代的。net框架。4.6.1约为60ms例如,在第一次请求时比4.5.2更快。
- 在发布可执行文件上进行性能测试,而不是在内部VisualStudio (VS)在初始化上增加了大量额外的开销调用而不是反映在实际的发布.exe构建中。)
- 如果你正在使用一个持续运行的服务/站点,一定要考虑向服务器发送一个虚拟请求startup——简单地让。net预先序列化连接。同样,如果你正在编写一个运行-退出应用程序,请考虑编写一个程序启动时后台虚拟请求。
- 确保你正在连接的服务不会重复使用经常。每次应用程序池在IIS服务上回收时,第一个
- 确保你正在连接的服务没有休眠。通过默认情况下,服务在不活动20分钟后休眠下一个传入的请求具有类似于后回收的延迟请求。
我已经遇到这个问题很多次了-我讨厌它!哈哈,虽然我从来没有最终解决它,你可以尝试一些事情。首先,在启动过程中调用web服务,首先将"痛苦"排除在外!其次,试着搞乱web服务的IIS应用程序池——让它永远不会回收自己,或者至少在早上一个不合适的时间或者每10000个请求回收一次。
我知道这可能不是一个很好的答案,但希望它能帮助一点!
编辑:
问题的一部分是web服务不是"总是"启动的——它会进入睡眠状态,循环等等,直到需要的时候。值得一读的是保持web服务的活力,59秒的上线时间等等!
我已经在我的basicHttpBinding上添加了这些设置,禁用了自动代理检测,并在第一次执行时获得了很大的加速。如果您是在内部网环境中,或者您知道您根本不需要任何代理,那么这当然可以很好地工作。
bypassProxyOnLocal ="false"
useDefaultWebProxy ="false"