为什么ColdFusion在远程调用CFC时无法识别我的会话变量?
示例:
我有一个我打电话使用的CFC:
http://www.mywebsite.com/CFC/myfunc.cfc?method=dosomething;arg1=foo;arg2=foo2
如果我提出以下内容......
<cfdump var="#session#" abort>
...在myfunc.cfc的第一行,我看到了所有会话变量的正确显示的cfdump。但是,如果我做一些简单的事情:
<cfset myvar = session.datasrc>
我收到500错误。元素DATASRC在会话中未定义。
session.datasrc出现在cfdump中,如果我不远程访问它(比如使用<cfinvoke>
),它可以正常工作。我错过了一些属性,还是CFIDE中的设置?某处某处不允许远程调用CFC来访问会话变量。感谢。
答案 0 :(得分:3)
对cfc的远程调用没有任何会话感。这总是一笔交易。
如果您通过上面的网址访问cfc,您将获得会话,因为它就像将其作为页面访问一样。 Web服务器将通过所有元素(例如会话cookie)传递到服务器,从而使会话范围可用于cfc。
如果远程访问cfc,则由于请求的方式,组件无法使用。
您不应该依赖服务方法中的瞬态范围变量。使用像coldspring之类的东西注入它们以提供对“配置”服务的依赖性或者将值作为参数传递。
对你来说,会话范围绝对不是存储数据源名称的正确位置。鉴于您使用的是ColdFusion 9,您可能有兴趣查看Application.cfc下的应用程序范围的数据源设置
答案 1 :(得分:3)
如果通过浏览器调用,调用“远程”cfc会保持会话。
<cffunction access="remote" returntype="any" output="No" hint="this hint" name="test">
<cfargument required="false" name="username" type="string" default=""/>
<cfset session.username="#arguments.username#">
<cfreturn session>
</cffunction>
使用http://localhost:8500/CFCs/your.cfc?method=test调用cfc,您将看到会话ID将保持不变。将其称为http://localhost:8500/CFCs/your.cfc?method=test&username=bob,您将设置会话变量,从URL中删除参数并保持会话变量。
如果您在不使用浏览器的情况下呼叫远程cfc,则需要按照here所述“手动”传入sessionid
答案 2 :(得分:1)
除非您为不同的用户使用不同的数据源,否则会话不是数据源等变量的适当范围。应用程序范围是应用程序范围变量的正确位置。我首先尝试使用应用程序范围,看看你是否还有问题。还要检查变量名拼写等内容,并尝试通过CFINVOKE调用在应用程序内本地命中该函数(如果需要,将函数设置为public)以查看它是否在本地正常工作。然后你知道它可能是你远程调用它的方式。