大家好,场景是这样的,winform程序启动后第一次调用webservice很慢>20s,接下来调用webservice就很快了<1s,将winform程序关闭后再次打开仍然是此现象从webservice端记载的日志看,从接收到调用请求到返回结果是非常快的,在几十毫秒的级别;根据分析结果,应该和http://www.cppblog.com/eday/articles/36045.html该文章所述比较类似,可惜网上基本上都是转载,根据其方法操作后,现象依旧,不知道有没有高人亲手搞过?现在的程序采用了warmup的方式,程序加载时自动先连接一下webservice,但是用户如果一进程序就点击调用webservice,就得耐心等待几十秒,这样依旧没有解决问题。
求高手指教。

解决方案 »

  1.   

    是的,只能采用预加载的方式。减少用户的感觉时间。或者使用轻量级的 web service 访问方式,比如 http post。
      

  2.   

    net 的assemble是字节码,当assembly运行的时候,需要runtime将字节码编译成本地代码。本地代码会被保存下来,下次再执行的时候就不用再编译了。这些保存的本地代码,会在进程结束的时候释放掉。下次,这个进程运行的时候会再次编译。
    如果调用一样,但是web site块,而winform慢的话,只能说是网络问题。
    是否参数值或者返回值太大。
    是否网络速度太慢。
    http://blog.csdn.net/marising/archive/2007/02/09/1506224.aspx
      

  3.   

    用ngen.exe工具可以加快单机上可以用,部署的话比较麻烦了
      

  4.   


    我参考的文章和你贴的文章是一样的,网络是没有问题的(局域网,同一个交换机上),Website、Winform均在同一台机器,webservice在另一台机器。ngen.exe也是产生一个AssemblyName+"XmlSerializer.dll"的序列化文件吧,没有效果。关于application访问webservice第一次慢的问题,试一下就可以看出来了,肯定是winform内部程序的问题,真是鸡肋啊。
      

  5.   


    不知道怎么试。给个demo程序!对于winform程序,第一次访问web service就要等待几十秒本地编译时间,这看起来很夸张。等上3秒钟有可能。还是写个demo看看你是怎么试出来的。如果不是,那只能考虑其它问题。
      

  6.   


    这个问题的确存在,而且我认为不是编译或者消耗 CPU 的操作。只能说微软太挫了。
      

  7.   

    我来试一下,我们访问 http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx创建一个winform程序,然后引用这个 web service地址(使用“添加web服务”窗体底部的“添加web服务”的方式,在下一个窗口才输入这个地址),然后在窗体上拖入一个按钮,写入点击事件处理代码:            var st = new Stopwatch();
                st.Start();
                var result = svr.getGeoIPContext();
                st.Stop();
                MessageBox.Show(string.Format("用时{0}秒", st.Elapsed.TotalSeconds));
    在我的机器上显示的时间只有1秒钟。
      

  8.   

    嗯,窗口的cs文件的代码:using System;
    using System.Diagnostics;
    using System.Windows.Forms;
    using WindowsFormsApplication3.cn.com.webxml.www;namespace WindowsFormsApplication3
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        static IpAddressSearchWebService svr = new IpAddressSearchWebService();        private void button1_Click(object sender, EventArgs e)
            {
                var st = new Stopwatch();
                st.Start();
                var result = svr.getGeoIPContext();
                st.Stop();
                MessageBox.Show(string.Format("用时{0}秒", st.Elapsed.TotalSeconds));
            }
        }
    }
      

  9.   

    使用“添加web服务”窗体底部的“添加web服务”的方式 -->  使用“添加服务”窗体底部的“高级=>添加web服务”的方式
    lz可以访问同样的互联网上的服务,把网络和人家的服务器计算的时间都算上,试试重现这个现象:点击这个按钮时需要花费几十秒等待时间。
      

  10.   


    非常感谢您的回复,我在内容中忽略了一个细节:WebService 存在自定义实体类的返回。因而文章http://www.cppblog.com/eday/articles/36045.html描述的与我的问题可能比较接近,可惜我没有尝试成功。
      

  11.   

    问题在于这篇文章中并没有给出所谓JIT编译那一部分客户端代理对象的时候需要多少时间的数值,因此到底它是几十秒中还是3秒钟,读者就根本不知道,就会盲目套用这个文章。而你的问题,你只能自己测试。什么样的实体类,它(没有服务器端的实质代码,只有客户端的属性而已)编译一下要20秒以上?能够自己给个测试。比如在同一个网站建另外一个web service(另外的wsdl),创建一个没有这个自定义实体类的web服务再试试连接时间。
      

  12.   

    随便写一个console程序来测试,第一次序列化和反序列化你的这个自定义实体类对象,会使用几十秒中吗?
      

  13.   

    因为要建立连接,所以连接的web serivces要尽可能的少,否则资源占用太大,最好把服务都写在一个web serivces中,如果第三方的web serivces,那就没办法了。