如何解决Webservice第一次访问特别慢的问题

目录
  • Webservice第一次访问特别慢问题
    • 问题知道了那么就说说如何解决
  • cxf动态调用Webservice接口

Webservice第一次访问特别慢问题

最近做一个项目遇到首次加载webservice的时候特别慢,于是Google一番,得到结果是

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

原理是:由于web代理默认是开启的,也就是HttpWebRequest.DefaultWebProxy的值不为null,而这个DefaultWebProxy是一个全局变量。故第一次调用webservice方法的时候只有等这个默认代理超时以后才能绕过,所以第一次比较慢。

然而这个方法还不是特别慢的最大原因,所以即使这么做了效果依然没有明显的变快,于是又是一番的Google。

最终发现一个另一个因素:

原因很简单,就是因为在第一次连接Webservice时,应用程序动态编译生成序列化程序集导致的慢。

问题知道了那么就说说如何解决

1、首先如何提前生成序列化程序集

这个时候你会发现你的bin目录下回生成一个“***.XmlSerializers.dll”

2、接下来就简单了,在程序启动的时候就把这个文件加载进来就OK了

Assembly.LoadFrom(Application.StartupPath + "\\***.XmlSerializers.dll");

        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            bool ok;
            var m = new System.Threading.Mutex(true, "***.exe", out ok);
            if (!ok) return;
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Assembly.LoadFrom(Application.StartupPath + "\\***.XmlSerializers.dll");
            Application.Run(new FormMain());
            GC.KeepAlive(m);
        }

3、骚年启动你的应用程序吧

cxf动态调用Webservice接口

package cxfClient;

import org.apache.cxf.endpoint.Endpoint;
import javax.xml.namespace.QName;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import org.apache.cxf.service.model.BindingInfo;
import org.apache.cxf.service.model.BindingOperationInfo;

public class CxfClient {
	public static void main(String[] args) throws Exception {
		String url = "http://localhost:9091/Service/SayHello?wsdl";
		String method = "say";
		Object[] parameters = new Object[]{"我是参数"};
		System.out.println(invokeRemoteMethod(url, method, parameters)[0]);
    }

	public static Object[] invokeRemoteMethod(String url, String operation, Object[] parameters){
        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
        if (!url.endsWith("wsdl")) {
            url += "?wsdl";
        }
        org.apache.cxf.endpoint.Client client = dcf.createClient(url);
        //处理webService接口和实现类namespace不同的情况,CXF动态客户端在处理此问题时,会报No operation was found with the name的异常
        Endpoint endpoint = client.getEndpoint();
        QName opName = new QName(endpoint.getService().getName().getNamespaceURI(),operation);
        BindingInfo bindingInfo= endpoint.getEndpointInfo().getBinding();
        if(bindingInfo.getOperation(opName) == null){
        	for(BindingOperationInfo operationInfo : bindingInfo.getOperations()){
        		if(operation.equals(operationInfo.getName().getLocalPart())){
        			opName = operationInfo.getName();
        			break;
        		}
        	}
        }
		Object[] res = null;
		try {
			res = client.invoke(opName, parameters);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return res;
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 在webservice里调用耗时方法出错的解决方案

    webservice调用耗时方法出错 在webservice里调用多个耗时的方法时,如果按顺序执行,下面的方法要等上面的方法执行完毕才能执行,如果这些方法比较耗时,并且包括回调等异步调用,就回出现下面的方法不能正确执行, 实例代码如下: public String runMethod(String syncId) { try { //处理Datapull dataPullService.setSyncId(syncId); //设置数据库参数 dataPullService.setJdbcUrl

  • java调用WebService服务的四种方法总结

    目录 一.前言 二.简介   三.具体解析 第一种方式,首先得下载axis2的jar包,Axis2提供了一个wsdl2java.bat命令可以根据WSDL文件自动产生调用WebService的代码. 第二种RPC 方式,强烈推荐. 第三种:利用HttpURLConnection拼接和解析报文进行调用. 第四种,利用httpclient 总结 一.前言 本来不想写这个的,因为网上类似的是在是太多了.但是想想自己前面段时间用过,而且以后可能再也没机会用了.所以还是记录一下吧.我这儿是以C语言生成的W

  • 如何解决Webservice第一次访问特别慢的问题

    目录 Webservice第一次访问特别慢问题 问题知道了那么就说说如何解决 cxf动态调用Webservice接口 Webservice第一次访问特别慢问题 最近做一个项目遇到首次加载webservice的时候特别慢,于是Google一番,得到结果是 <system.net> <defaultProxy enabled="false" useDefaultCredentials="false"> <proxy/> <byp

  • ASP.NET网站第一次访问慢的解决方法

    本篇经验以IIS8,Windows Server 2012R2做为案例. IIS8 运行在Windows Server 2012 and Windows 8 版本以上的平台上. IIS中应用程序池和网站是单独存在的,但是网站运行必须建立在对应的应用程序池启动的前提下. 默认情况下,应用程序池在不活动情况下(无请求操作),一段时间后,将被IIS自动回收掉. IIS8 自带应用程序初始化工具包,IIS7.5要搜索独立安装包进行安装,低于7.5的暂时不支持IIS自动初始化. 本篇经验中的方法能解决AS

  • ASP.NET第一次访问慢的完美解决方案(MVC,Web Api)

    问题现象 访问asp.net web项目的时候,第一次访问比较慢,当闲置一段时间后,再次访问还是会非常慢. 问题原因 这是IIS回收造成的,再次访问的时候会初始化操作,初始化需要耗费时间,所以访问会比较慢,第二次访问的时候不需要初始化操作,因此变快了. 解决办法 IIS应用初始化会在网站第一次创建后或者对应网站的应用程序池回收后,自动开启新程序池,并启动网站初始化,模拟一次正常请求,使网站一直处于在线状态. 修改IIS中的配置 1.修改启用应用程序池(AlwaysRunning):保证应用程序池

  • Python解决多进程间访问效率低的方法总结

    目录 前言 使用进程间Queue效率问题场景 采用管道模式解决 总结 前言 最近在解决一些算法优化的问题,为了实时性要求,必须精益求精的将资源利用率用到极致.同时对算法中一些处理进行多线程或者多进程处理. 在对代码的调试过程中,发现在进程间队列使用耗时很长,特别是图片这种比较大的数据的时候. 可以先看一下我下面的demo是不是符合你的场景. 下面还有我的解决方案. 使用进程间Queue效率问题场景 代码样例如下,模拟从两个视频读取图片帧进行处理. #!/user/bin/env python #

  • 解决maven第一次创建项目太慢的问题

    Maven是 Apache 下的一个纯 Java 开发的开源项目,是一个项目构建和管理的工具:它提供了帮助管理 构建.文档.报告.依赖.scms.发布.分发的方法.可以方便的编译代码.进行依赖管理.管理二进制库等等. 问题: 第一次用maven创建项目的时候,因为本地仓库中没有jar包,需要从中央仓库下载,所以会比较慢 解决方法: 因为从中央仓库下载默认使用的国外的镜像下载,速度比较慢,我们可以把镜像修改为从阿里云下载,这样比较快 方法,打开maven在本地的位置,找到conf文件夹下的sett

  • 解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了

    1.今天网上下载一个博客项目,发现本地访问,js,css加载不了. 我想应该是项目上线的安全措施,但是我想调试项目.找到方法如下 在settings.py里面编辑 添加 STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), ) 另外把 STATIC_ROOT = os.path.join(BASE_DIR, 'static') 改为 STATIC_ROOT = os.path.join(BASE_DIR, 'static1') 即这里面的s

  • 如何正确解决VuePress本地访问出现资源报错404的问题

    背景 最近发现好多小伙伴刚用VuePress,然后一build完就直接用本地浏览器访问,结果出现黑块.仅仅出现那种问题还好,给项目安装 vuepress-plugin-serve 插件就行了, 但是如果有需求是需要离线查看 VuePress 生成后的文档呢?所以我特地研究了一下-- 解决办法 打开 .vuepress/config.js 文件,把 base 的值改成 ./,为了方便调试,最好这样写: //base: "/", base: "./", 写两个,一个用于

  • 用jQuery与JSONP轻松解决跨域访问的问题

    时间过得好快,又被拉回js战场时, 跨域问题这个伤疤又开疼了. 好在,有jquery帮忙,跨域问题似乎没那么难缠了.这次也借此机会对跨域问题来给刨根问底,结合实际的开发项目,查阅了相关资料,算是解决了跨域问题..有必要记下来备忘. 跨域的安全限制都是指浏览器端来说的.服务器端是不存在跨域安全限制的,所以通过本机服务器端通过类似httpclient方式完成"跨域访问"的工作,然后在浏览器端用AJAX获取本机服务器端"跨域访问"对应的url.来间接完成跨域访问也是可以的

  • 解决ajax不能访问本地文件问题(利用js跨域原理)

    博主自己在开发一个无后台,只有前台的查询系统时,遇到一个困难,如何利用Ajax读取自己的本地json文件,百度.谷歌了下,发现大部分文章都是在说修改浏览器参数,但是自己想想,用户在使用时,还要修改浏览器的参数,这样显然降低了用户体验.自己琢磨了一段时间,发现可以利用js跨域原理来解决这个瓶颈.将之前要读取的json文件,变为js对象文件,这样就可以读取这个文件,然后写一个函数来对这个js对象进行解析. 首先说明下js跨域原理和jsonp这个技术(如果说的不详细,可自行百度.谷歌) src可以跨域

  • 解决RestTemplate第一次请求响应速度较慢的问题

    目录 RestTemplate第一次请求响应速度较慢问题 RestTemplate请求的超时设置 RestTemplate第一次请求响应速度较慢问题 使用RestTemplate请求微信的接口发现第一次请求需要8秒左右的时间,查阅了JDK资料发现是IPv6的问题 只需要在启动时添加-Djava.net.preferIPv4Stack=true即可. RestTemplate请求的超时设置 //设置rest请求的超时时间 // SimpleClientHttpRequestFactory simp

随机推荐