会话变量和远程CFC调用

时间:2011-06-27 18:04:20

标签: web-services coldfusion coldfusion-9

为什么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来访问会话变量。感谢。

3 个答案:

答案 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)以查看它是否在本地正常工作。然后你知道它可能是你远程调用它的方式。