2011-06-27 137 views
0

爲什麼在遠程調用CFC時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中未定義。

session.datasrc出現在cfdump中,如果我不能遠程訪問它(如使用<cfinvoke>),它工作正常。我錯過了一些財產,或在CFIDE的設置?某處某處不允許遠程調用CFC來訪問會話變量。謝謝。

+0

此外,需要說明的是一些閱讀後,我相信,這要由保護封裝。在所有情況下,哪一個會話應遠程調用cfc調用?但是,我仍然難倒了。 –

回答

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,您將需要「手動」通過在會話ID爲討論here

3

對cfc的遠程呼叫沒有任何會話感。這總是一筆交易。

如果您通過url訪問cfc,您將獲得會話,因爲它像訪問頁面一樣。 Web服務器會將所有元素(如會話cookie)傳遞給服務器,使會話範圍可供cfc使用。

如果您遠程訪問cfc,則由於請求的方式,組件不會提供這些信息。

您不應該依賴服務方法中的瞬態作用域變量。要麼使用類似coldspring的東西注入它們以提供對「配置」服務的依賴或以參數形式傳遞值。

對你來說,會話​​範圍絕對不是存儲數據源名稱的正確位置。鑑於您使用的是ColdFusion 9,您可能有興趣查看Application.cfc下的應用程序範圍數據源設置。

+0

什麼是最矛盾的是,我可以cfdump會話結構,它顯示session.datasrc作爲一個定義的變量。 –

1

會話不適用於像數據源這樣的變量,除非您爲不同的用戶使用不同的數據源。應用程序範圍是應用程序範圍變量的適當位置。我首先嚐試使用應用程序範圍,看看你是否仍然有問題。還要檢查變量名稱拼寫等內容,並嘗試通過CFINVOKE調用從應用程序內部本地訪問該函數(如果需要,將該函數設置爲public)以查看它是否可以在本地正常工作。然後你知道這可能是你遠程調用它的方式。

+0

拼寫是正確的。我也可以在本地調用它。正如斯蒂芬莫雷蒂所描述的CFC電話是一次性交易。我一直在讀這一天。每篇文章和論壇都指出了一個事實:對cfc的遠程調用沒有「會話」。 –