如何解決Webservice第一次訪問(wèn)特別慢的問(wèn)題
Webservice第一次訪問(wèn)特別慢問(wèn)題
最近做一個(gè)項(xiàng)目遇到首次加載webservice的時(shí)候特別慢,于是Google一番,得到結(jié)果是
<system.net>
<defaultProxy enabled="false" useDefaultCredentials="false">
<proxy/>
<bypasslist/>
<module/>
</defaultProxy>
</system.net>原理是:由于web代理默認(rèn)是開(kāi)啟的,也就是HttpWebRequest.DefaultWebProxy的值不為null,而這個(gè)DefaultWebProxy是一個(gè)全局變量。故第一次調(diào)用webservice方法的時(shí)候只有等這個(gè)默認(rèn)代理超時(shí)以后才能繞過(guò),所以第一次比較慢。
然而這個(gè)方法還不是特別慢的最大原因,所以即使這么做了效果依然沒(méi)有明顯的變快,于是又是一番的Google。
最終發(fā)現(xiàn)一個(gè)另一個(gè)因素:
原因很簡(jiǎn)單,就是因?yàn)樵诘谝淮芜B接Webservice時(shí),應(yīng)用程序動(dòng)態(tài)編譯生成序列化程序集導(dǎo)致的慢。
問(wèn)題知道了那么就說(shuō)說(shuō)如何解決
1、首先如何提前生成序列化程序集

這個(gè)時(shí)候你會(huì)發(fā)現(xiàn)你的bin目錄下回生成一個(gè)“***.XmlSerializers.dll”
2、接下來(lái)就簡(jiǎn)單了,在程序啟動(dòng)的時(shí)候就把這個(gè)文件加載進(jìn)來(lái)就OK了
Assembly.LoadFrom(Application.StartupPath + "\\***.XmlSerializers.dll");
/// <summary>
/// 應(yīng)用程序的主入口點(diǎn)。
/// </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、騷年啟動(dòng)你的應(yīng)用程序吧
cxf動(dòng)態(tài)調(diào)用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[]{"我是參數(shù)"};
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接口和實(shí)現(xiàn)類(lèi)namespace不同的情況,CXF動(dòng)態(tài)客戶端在處理此問(wèn)題時(shí),會(huì)報(bào)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;
}
}以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot jpa實(shí)現(xiàn)優(yōu)雅處理isDelete的默認(rèn)值
如果多個(gè)實(shí)體類(lèi)都有 isDelete 字段,并且你希望在插入時(shí)為它們統(tǒng)一設(shè)置默認(rèn)值時(shí)改怎么做呢,本文為大家整理了一些方法,希望對(duì)大家有所幫助2024-11-11
基于SpringBoot和Leaflet的行政區(qū)劃地圖掩膜效果實(shí)戰(zhàn)教程
本文講解的是一種圖層級(jí)的掩膜,即使用行政區(qū)劃圖層來(lái)進(jìn)行掩膜,使用場(chǎng)景為,用戶只需要在地圖頁(yè)面中展示目標(biāo)行政區(qū)劃內(nèi)的影像信息,對(duì)于行政邊界外的影像,這篇文章主要介紹了基于SpringBoot和Leaflet的行政區(qū)劃地圖掩膜效果實(shí)戰(zhàn),需要的朋友可以參考下2024-05-05
詳解springboot中redis的使用和分布式session共享問(wèn)題
這篇文章主要介紹了詳解springboot中redis的使用和分布式session共享問(wèn)題,詳細(xì)的介紹了解決分布式系統(tǒng)的session如何共享問(wèn)題,有興趣的可以了解一下2017-11-11
Springboot使用redisson實(shí)現(xiàn)分布式鎖的代碼示例
在實(shí)際項(xiàng)目中,某些場(chǎng)景下可能需要使用到分布式鎖功能,那么實(shí)現(xiàn)分布式鎖有多種方式,常見(jiàn)的如mysql分布式鎖、zookeeper分布式鎖、redis分布式鎖,本文介紹springboot如何使用redisson實(shí)現(xiàn)分布式鎖,需要的朋友可以參考下2023-06-06
SpringBoot中間件ORM框架實(shí)現(xiàn)案例詳解(Mybatis)
這篇文章主要介紹了SpringBoot中間件ORM框架實(shí)現(xiàn)案例詳解(Mybatis),本篇文章提煉出mybatis最經(jīng)典、最精簡(jiǎn)、最核心的代碼設(shè)計(jì),來(lái)實(shí)現(xiàn)一個(gè)mini-mybatis,從而熟悉并掌握ORM框架的涉及實(shí)現(xiàn),需要的朋友可以參考下2023-07-07
Java實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)MNIST手寫(xiě)數(shù)字識(shí)別的示例詳解
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)MNIST手寫(xiě)數(shù)字識(shí)別的相關(guān)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-01-01
SpringBoot同一接口多個(gè)實(shí)現(xiàn)類(lèi)配置的實(shí)例詳解
這篇文章主要介紹了SpringBoot同一接口多個(gè)實(shí)現(xiàn)類(lèi)配置的實(shí)例詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11

