假如我们在一个我们没有管理权限的Coldfusion服务器上开发CF webservices,如果你发现,不管我们对某一服务怎么修改,可调用的时候还是修改前的版本,你一定非常的恼火。这是因为ColdFusion缓存了webservice的配置,所以只有在先清除了已缓存的旧版本后,后续的改变才能起效。
CF管理员可以直接做这样清理的工作。可惜我们没有管理员访问权限,所有我们需要使用另外的方法--绕道刷新服务缓存。
我们可以通过删除缓存中的服务来将它完整的从缓存中清除(它将在下次其他人调用它的时候重新缓存),利用这一点,我们可以先删除残留缓存然后重新调用服务来生成一个新的缓存来绕道实现服务缓存的刷新,注意,如果在一台共享服务器上运行以下代码的话,您可以看到服务器上所有人缓存的Web services。不过删除或刷新所有的服务是无害的,所以不用考虑是否影响其他用户的服务。
以下是刷新服务缓存的代码,将其复制一个单独的CF文件中然后运行就可以了:
-
<H2>Webservices?in?cache:</H2>??
-
??? ??
-
<cfobject?action="CREATE"?type="JAVA"?class="coldfusion.server.ServiceFactory"?name="factory">??
-
<cfset?xmlRpc?=?factory.getXMLRPCService()>??
-
<cfset?webServices?=?xmlRpc.mappings>??
-
??? ??
-
<cfparam?name="url.del"?default="false">??
-
<cfparam?name="url.refresh"?default="false">??
-
<cfoutput>??
-
<cfif?url.del>??
-
??<cfloop?item="webService"?collection="#webServices#">??
-
<cfset?xmlRpc.unregisterWebService(webService)>??
-
??</cfloop>??
-
??<cflocation?url="#cgi.script_name#">??
-
</cfif>??
-
<cfif?url.refresh>??
-
??<cfloop?item="webService"?collection="#webServices#">??
-
<cfset?xmlRpc.refreshWebService(webService)>??
-
??</cfloop>??
-
??<cflocation?url="#cgi.script_name#">??
-
</cfif>??
-
??? ??
-
<cfloop?item="webService"?collection="#webServices#">??
-
??-?#webService#<BR>??
-
???<cfflush>??
-
</cfloop>??
-
????<BR>??
-
[<A?HREF="#cgi.script_name#?del=1">KILL?ALL</A>] ??
-
<BR>??
-
[<A?HREF="#cgi.script_name#?refresh=1">REFRESH?ALL</A>] ??
-
</cfoutput>??
-
<HR>??
原文:Refreshing Cached ColdFusion Webservices Through the Back Door |