Я использую ColdFusion 8 на двух серверах с одинаковой версией ColdFusion и одинаковыми настройками.
Мы создаем структуру в CFC и передаем ее в браузер с помощью функции toScript (),Результирующий JavaScript на веб-странице выглядит следующим образом:
TrackingInfo = new Object();
TrackingInfo["child_catalog_id"] = "";
TrackingInfo["ipaddress"] = "63.123.41.14";
TrackingInfo["parent_catalog_id"] = 1642;
TrackingInfo["session_id"] = 30000390;
TrackingInfo["referral"] = "";
TrackingInfo["useragent"] = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) G ecko/20100101 Firefox/10.0.2";
TrackingInfo["querystring"] = "";
Позже на странице JavaScript мы передаем структуру TrackingInfo (ABOVE) тому же CFC, но другой функции, используя CFAJAXPROXY.как это:
var jro = new JS_SessionTracking();
jro.InsertSessionTrackingFunction(TrackingInfo);
В CFC функция InsertSessionTrackingFunction принимает структуру и вводит ее в базу данных,
<!--- INSERT SESSION TRACKING FUNCTION --->
<cffunction name="InsertSessionTrackingFunction" access="remote">
<cfargument name="TrackingInfo" required="true">
<cfset LOCAL.TrackingInfo = ARGUMENTS.TrackingInfo>
// DATABASE STUFF HAPPENS HERE
<cfreturn true>
</cffunction>
На наших сайтах разработки и стадии это работает без нареканий, провереново многих машинах и многих браузерах.Он работает так, как задумано и желательно.
Когда мы переносим код в рабочий процесс, каждый его аспект работает, за исключением самой последней функции (InsertSessionTrackingFunction).Наш сервер отказывается обрабатывать JavaScript, переданный CFC с веб-страницы.Firebug не показывает ошибок.Истинное значение НЕ возвращается.
Что может привести к тому, что CFC не понравится структура, переданная ему в настройке LIVE, но будет отлично работать в настройке разработки?
Также я попытался использоватьфункция ColdFusion serializeJSON () для форматирования структуры перед передачей ей страницы.Он выводил на страницу примерно так:
LOCAL.TrackingInfo = serializeJSON(LOCAL.TrackingInfo); // serialize the structure
TrackingInfo = "{\"CHILD_CATALOG_ID\":\"\",\"IPADDRESS\":\"63.173.41.14\",\"PARENT_CATALOG_ID\":1642,\"SESSION_ID\":30000390,\"REFERRAL\":\"\",\"USERAGENT\":\"Mozilla\\/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko\\/20100101 Firefox\\/10.0.2\",\"QUERYSTRING\":\"\"}";
Я передал структуру функции и использовал функцию deserializeJSON для ее анализа:
<cfset LOCAL.TrackingInfo = deserializeJSON(LOCAL.TrackingInfo)>
Тем не менее, эта функция отлично работает в разработкеи постановка, но не в производстве.
Пожалуйста, дайте мне несколько идей относительно того, почему это может происходить и как я могу исправить проблему.
ОБНОВЛЕНИЕ
Я воспользовался советом Джейка Физеля и добавил <cfset var LOCAL = {}>
в заголовок каждой функции, чтобы убедиться, что значения не распространяются.Хотя это кажется хорошей привычкой в CF8, это не решило проблему.
Приведенный ниже код прекрасно работает как на производстве, так и в реальной среде.Никаких изменений в CFC не потребовалось, чтобы сделать эту работу.ColdFusion просто не позволит передать эту структуру в функцию на этом сервере.
<script>
<cfoutput>
#toscript(TrackingInfo.SID, "SID")#
#toscript(TrackingInfo.parent_catalog_id, "Parent")#
#toscript(TrackingInfo.child_catalog_id, "Child")#
</cfoutput>
// CREATE JAVASCRIPT OBJECT
var jro = new JS_SessionTracking();
jro.InsertSessionTrackingFunction(SID,Parent,Child);
</script>