Coldfusion 作用域不在会话作用域的CFC文件夹之外工作

Coldfusion 作用域不在会话作用域的CFC文件夹之外工作,coldfusion,cfc,application.cfc,coldfusion-2018,Coldfusion,Cfc,Application.cfc,Coldfusion 2018,我最近在工作中安装了ColdFusion 2018,但由于无法使范围正常工作而感到沮丧。像往常一样,我把我所有的.CFC都放在/CFC文件夹中,如果没有该文件夹中的空白application.cfm文件,它们都不会执行。我尝试过扩展应用程序,包括应用程序、代理扩展应用程序,将CFC移动到根文件夹只会导致JSON上的语法错误。在过去的两周里,我已经阅读了我能找到的每一篇文章,但我仍然无法理解为什么scope不起作用。似乎我可以在/CFC文件夹内设置会话变量,但在文件夹外它们不可用?我已经有几年没和

我最近在工作中安装了ColdFusion 2018,但由于无法使范围正常工作而感到沮丧。像往常一样,我把我所有的.CFC都放在/CFC文件夹中,如果没有该文件夹中的空白
application.cfm
文件,它们都不会执行。我尝试过扩展应用程序,包括应用程序、代理扩展应用程序,将CFC移动到根文件夹只会导致JSON上的语法错误。在过去的两周里,我已经阅读了我能找到的每一篇文章,但我仍然无法理解为什么scope不起作用。似乎我可以在/CFC文件夹内设置会话变量,但在文件夹外它们不可用?我已经有几年没和CF合作过了,但是我认为自己是精通的,因为我的生活不能让它运转。我很可能因为树木而错过了森林,但如果有人愿意帮忙,我将不胜感激

实例化对象

application.SessionMgr = CreateObject(this.obj,'CFC.SessionMgr').init('session');
代理调用

cfajaxproxy cfc="CFC/SessionMgr"       jsclassname="SessionMgr";
返回正确

var s = new SessionMgr();
       var setReport = s.setValue('ReportID', document.getElementById('cboReportKey').value);
       alert(setReport);
但是,即使手动设置
session.ReportID=7
也不会在文件夹外持久存在

这是
SessionMgr.init

这是
init

<cffunction name="init" access="public" returntype="SessionMgr" output="no" hint="I instantiate and return this object.">
        <cfargument name="scope" type="string" required="yes">
        <cfargument name="requestvar" type="string" default="SessionInfo">
            <cfset var scopes = "application,Client,Session">
            <cfif Not ListFindNoCase(scopes, arguments.scope)>
                <cfthrow message="The scope argument for SessionMgr must be a valid scope (#scopes#)." type="MethodErr">
            </cfif>
            <cfset variables.scope = arguments.scope>
            <cfset variables.requestvar = arguments.requestvar>
            <cfset updateRequestVar()>
        <cfreturn this>
    </cffunction>

好的,在尝试了所有方法之后,这里是解决方案。代理扩展在这种情况下不起作用,请尝试。最终有效的方法是在/cfc文件夹中创建一个application.cfc,并从/root application.cfc中剥离出所有功能组件,并确保/cfc文件夹中的剥离版本中的应用程序名称与/root cfc名称相同。此psuedo扩展了/root application.cfc中的所有功能,并使框架在/cfc文件夹中的所有内容都可用。感谢在座的每一位帮助我在驾驶室之外思考并解决此问题的人。

此课程将仅在您的应用程序内部支持。(项目的根目录)。有关父文件夹应用程序的会话范围外搜索。比如父文件夹是否有任何应用程序cfc,如果它有app.cfc,那么检查它是否启用了会话等。我在根目录中有application.cfc,我在根目录中实例化了会话范围,超时等。我不明白为什么在/cfc文件夹中使用cfc函数更改会话变量的任何尝试都不会在文件夹外持续存在。在cfc文件夹中,您永远不需要.cfc of.cfm,它只是继承了,现在我在CF 2018上,CFC文件夹中的任何东西都将在没有空白应用程序.CFM文件的情况下工作,并且所有尝试扩展根应用程序。CFC只会破坏HAVOK,没有改进。您使用标签吗?如果是,请添加sessionManagement=“yes |”,则只有您可以访问整个应用程序中的会话作用域。sessionMgr位于应用程序作用域中,但init()调用将会话作为参数。该体系结构如何支持多个会话?此外,createObject()的第一个参数似乎不正确。它应该是
createObject(“cfc.sessionMgr”)另一方面,我将尝试消除ajax代理的内容,并确保您可以首先在服务器端得到正确的结果。一旦您验证了这一点,然后尝试使用ajax,尽管我建议您不要使用内置的coldfusion ajax功能,而是自己使用jQuery或类似的库来实现。很好,您已经重新实现了这一点,但我认为我们还没有发现实际的问题。我们刚刚进行了一次黑客攻击,使其立即生效。实际上,您并不是在伪扩展base App.cfc,而是在嵌套文件夹中的新应用程序中重用该名称。仍然存在导致干扰和阻止基本应用程序正常工作的问题。在将来的某个时候,如果应用程序名称发生变化,或者处理
Application.cfc
的方式发生了变化,这将返回到找出cfc停止工作的原因。+1至@Shawn comment。你不应该需要这个来让它工作。它应该像你期望的那样工作。我完全同意这两种说法,这是一种黑客行为。而且一开始就不应该要求它。我仍然倾向于使用一些cfadmin设置来隔离应用程序范围以及相关的范围。我将继续推进开发,如果出现任何新的解决方案,我将更新此线程与您的问题无关,但我不建议这样使用
SetVariable()
Evaluate()
。尤其是使用“远程”方法。它可能允许恶意用户更改自己会话之外的其他内容,例如应用程序变量!仅限intranet,因此安全性不是问题
<cffunction name="setValue" access="remote"  hint="I set the value of the given user-specific variable." returntype="string">
        <cfargument name="variablename" type="string" required="yes">
        <cfargument name="value" type="any" required="yes">
            <cfset var val = arguments.value />
            <cfset SetVariable("#arguments.variablename#", val) />
            <cfset r =  Evaluate(arguments.variablename) />
        <cfreturn r />
    </cffunction>