none
winform 程序第一次访问Webservice 慢的问题 RRS feed

  • 问题

  • 大家好,目前我有个exe程序需要从webservice调用数据,每次程序启动时,需要从webservice获取一些数据,第一个访问webservice的地方耗时最久,接下来这个exe调用webservice就很快,如何解决程序启动后的第一次访问速度慢的问题,谢谢。

    2011年1月31日 8:40

答案

  • 这个是因为IIS在应用程序池长时间空闲的时候会关闭工作进程。重新启动进程需要一定时间。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2011年2月3日 1:38
    版主
  • 这个现象在 C#或Java这等高级语言中很常见。即第一次运行时编译/装载。

    通用的解决办法是,再做一个“心跳服务”,每个一定的时间去调用一下webservice的某的小方法。以便让IIS一直让该webservice处于兴奋状态。

    “心跳服务”注册并运行在服务器上。服务器开机时即自动启动。与客户端的winform何时启动完全无关。

     也就是说,它可以做到应用服务器只要一开机,就始终让webservice处于兴奋状态。

    这样,无论你的winform何时启动,系统效率都是最高的了。 

    希望对你有所帮助。

    2011年2月6日 15:49

全部回复

  • 这个是一个问题,一般我会在应用程序启动的时候后台开个线程去访问一下这个web service的一个空方法,不过如果你的应用程序一开始就要调用这个web service那么这个方法不合适。

    还有一个就是长时间你不操作你的应用程序,web service可能会报超时过期的错误,这个一般的解决办法是在后台定时调用某个空方法来保持活动。

     


    family as water
    2011年1月31日 15:17
  • 您好!请参考这里:http://blog.csdn.net/rrrfff/archive/2011/01/31/6170653.aspx
    rrrfff
    2011年2月1日 4:17
  • 这个是一个问题,一般我会在应用程序启动的时候后台开个线程去访问一下这个web service的一个空方法,不过如果你的应用程序一开始就要调用这个web service那么这个方法不合适。

    还有一个就是长时间你不操作你的应用程序,web service可能会报超时过期的错误,这个一般的解决办法是在后台定时调用某个空方法来保持活动。

     


    family as water

    您好,关于“长时间不操作应用程序,web service可能超时过期”,当我的程序起来之后,调用完web service不是就释放掉了与web service的连接了吗?为什么会存在超时?这一点不是很理解,谢谢。
    2011年2月1日 5:24
  • 您好!请参考这里:http://blog.csdn.net/rrrfff/archive/2011/01/31/6170653.aspx
    rrrfff

    你好,我是.net framework 2.0的。
    • 已建议为答案 Sage Gao 2012年5月3日 6:38
    2011年2月1日 5:26
  • 因为问题描述一致,所以您不防一试。也许这不是4.0特有的
    rrrfff
    2011年2月1日 8:10
  • 这个是一个问题,一般我会在应用程序启动的时候后台开个线程去访问一下这个web service的一个空方法,不过如果你的应用程序一开始就要调用这个web service那么这个方法不合适。

    还有一个就是长时间你不操作你的应用程序,web service可能会报超时过期的错误,这个一般的解决办法是在后台定时调用某个空方法来保持活动。

     


    family as water

    您好,关于“长时间不操作应用程序,web service可能超时过期”,当我的程序起来之后,调用完web service不是就释放掉了与web service的连接了吗?为什么会存在超时?这一点不是很理解,谢谢。


    这个是经验之谈,04年的时候在1.1的框架下用web service做中间层,遇到这种情况。在客户端界面操作的时候,web service调用是伴随着客户端某个界面的生命周期,如果客户长时间不操作就会出现这个问题。

     


    family as water
    2011年2月1日 12:31
  • 这个是因为IIS在应用程序池长时间空闲的时候会关闭工作进程。重新启动进程需要一定时间。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2011年2月3日 1:38
    版主
  • 您好,试了一下该方法,但是效果不明显,第一次调用耗时14s,而第二次调用仅900ms左右,相差还是蛮大的。

    同样的程序拿C++尝试了一下,C++明显要快的多,是不是我的代码上存在问题。

    WebService的调用,我是直接在项目添加引用,然后设定Webservice的url访问的,没有通过webclient的方式。

    2011年2月6日 1:28
  • 这个是因为IIS在应用程序池长时间空闲的时候会关闭工作进程。重新启动进程需要一定时间。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP


    非常感谢,这样我就明白了为什么会超时了。

    不过刚刚我模拟了一下环境,我的exe在运行时,调用一次webservice后,然后将webservice所在服务器的iis重启(cmd:iisreset),然后再次访问webservice,依然速度很快。

    这就有点奇怪了,从测试结果看,应该和webservice端没有什么关系,是不是当exe的进程起来时,第一次调用webservice会产生某种文件,比如记住网络连接、第二次连得时候就快的多等。

    求大伙指教。

    2011年2月6日 2:05
  • 你可以调试服务器端看看两次请求之间服务器有什么调试信息输出

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2011年2月6日 2:10
    版主
  • 你可以调试服务器端看看两次请求之间服务器有什么调试信息输出

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP


    非常感谢您的回答。

    从webservice端调试结果看,获得webservice访问请求及返回结果都是非常快的,第一次和第二次相差不大。

    主要的耗时点仍然存在winform端,从网上的搜索资料看,应该是因为产生序列化类慢,如http://www.cppblog.com/eday/articles/36045.html此文章所述,但是按照其解决方案的第6点操作,仍然没有效果:VS2005利用Release编译,会产生AssemblyName+"XmlSerializer.dll"的序列化文件,可以随着客户端一起部署,跟5这种方式不太一样,可以根据实际情况来选择。

    唉,难道winform的程序使用webservice就是鸡肋?
    2011年2月6日 5:05
  • 是需要部署在应用程序加载dll的搜索路径里。

    新的程序可以用用WCF来序列化对象到现有的类型。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2011年2月6日 14:55
    版主
  • 这个现象在 C#或Java这等高级语言中很常见。即第一次运行时编译/装载。

    通用的解决办法是,再做一个“心跳服务”,每个一定的时间去调用一下webservice的某的小方法。以便让IIS一直让该webservice处于兴奋状态。

    “心跳服务”注册并运行在服务器上。服务器开机时即自动启动。与客户端的winform何时启动完全无关。

     也就是说,它可以做到应用服务器只要一开机,就始终让webservice处于兴奋状态。

    这样,无论你的winform何时启动,系统效率都是最高的了。 

    希望对你有所帮助。

    2011年2月6日 15:49
  • 您好!请参考这里:http://blog.csdn.net/rrrfff/archive/2011/01/31/6170653.aspx


    rrrfff


    你好,我是.net framework 2.0的。

    这个兄弟的答案是对的,我也遇到楼主同样的问题,在config中添加如下代码便可以解决

    <system.net>
        <defaultProxy enabled="false" useDefaultCredentials="false"></defaultProxy>
      </system.net>

    谢谢

    2012年5月3日 6:40