سؤال

مشكلة:عند الطلب WSDL ل مركبات الكربون الكلورية فلورية, ، أحصل على الخطأ التالية: النموذج المتغير غير محدد.يحدث ذلك في هذا السطر من التعليمات البرمجية، في أسلوب OnRequestStart في application.cfc

<cfif structKeyExists(form,'resetappvars')>
    <cfset OnApplicationStart() />
</cfif>

إذا طلبت طريقة محددة، فإنه يعمل بشكل جيد.لقد فكرت في استخدام cfparam لإنشاء بنية نموذج افتراضية في حالة عدم وجودها، ولكن هذا يبدو وكأنه اختراق قبيح وأخشى أنه سيؤدي بالفعل إلى إنشاء بنية النموذج في المتغيرات أو نطاق CFC هذا.ربما هذا خطأ مشروع أيضا؟

ملحوظة: يحدث هذا فقط عندما أطلب WSDL، إذا قمت باستدعاء طريقة مباشرة - يتم تنفيذ التعليمات البرمجية كما هو متوقع دون مشاكل.

تحديث: نموذج كود Application.cfc - ما عليك سوى إضافة أي CFC إلى تطبيقك وطلبه باستخدامه ?wsdl لرؤية هذه القضية.لقد تم اختبار هذا (وفشل) على ColdFusion 7 وColdFusion 8.

<cfcomponent output="false">

    <cffunction name="OnApplicationStart" access="public" returntype="boolean" output="false" hint="Fires when the application is first created.">
        <cfset application.dsn = "my_dsn" />
        <cfreturn true />
    </cffunction>

    <cffunction name="OnRequestStart" access="public" returntype="boolean" output="false" hint="Fires at first part of page processing.">
        <cfargument name="TargetPage" type="string" required="true" />
        <cfif structKeyExists(form,'resetappvars')>
            <cfset OnApplicationStart() />
        </cfif>
        <cfreturn true />
    </cffunction>
</cfcomponent>
هل كانت مفيدة؟

المحلول

هذا مشاركة بن نضال يعطي قائمة مفصلة بالنطاقات المتاحة لأنواع مختلفة من الطلبات.

ومن خلال قراءتها يمكنك معرفة ذلك بسهولة استمارة النطاق غير متاح في سياق معين، ولكن عنوان URL يكون.

نصائح أخرى

ربما حاول إضافة:

 <cfif IsDefined("form")>...</cfif>

حول الكود أعلاه؟

هل يمكن أيضا cfparam المتغير الذي تبحث عنه ثم قم فقط بتغيير المنطق الخاص بك قليلاً (بافتراض أنsetAppVars هو أمر منطقي:

<cfparam name="form.resetAppVars" default="false" />
...
<cfif form.resetAppVars>
  <cfset OnApplicationStart() />
</cfif>

يحرر:لست متأكدًا مما إذا كان من الممكن اعتبار الكود أعلاه بمثابة اختراق، ولكن يبدو لي أنه CF قياسي جدًا.

لقد سمعت أنها مجرد مسألة رأي، ولكن يبدو لي أنه من غير المناسب الإشارة إلى نطاق النموذج الخاص بك داخل CFC، حيث لا يوجد ضمان بأن نطاق النموذج سيكون متاحًا عند استدعاء cfc الخاص بك وعندما تكون طريقتك يسمى.من الأفضل التأكد من أن أي بيانات يجب أن تكون متاحة للطريقة يتم توفيرها بشكل صريح للكائن الخاص بك.يمكن القيام بذلك إما عن طريق تضمين وسيطة:

<cfargument name="resetAppVars" type="boolean" required="false" default="false" />

ثم تقوم بالتحقق من الوسيطات.resetAppVars، ويتم تعريفها دائمًا، ولكن يتم تعيينها افتراضيًا على خطأ.

أو عن طريق إنشاء سمة على الكائن الخاص بك وإنشاء طريقة تعيين واضحة:

(في الجزء العلوي من CFC الخاص بك)

<cfset this.resetAppVars = false />


<cffunction name="setResetAppVars" access="public" returnType="void" output="false">
   <cfargument name="flagValue" type="boolean" required="true" />

   <cfset this.resetAppVars = arguments.flagValue />
</cffunction>

في هذه الحالة سوف تتحقق من this.resetAppVars.يمكنك أيضًا تحديد نطاق هذا محليًا باستخدام <cfset var resetAppVars = false /> كإعلان، مما يجعله سمة خاصة للكائن الخاص بك، وربما يكون مناسبًا، لذا لا يمكن للتعليمات البرمجية التي تستدعي الكائن أن تقوم بالكتابة بشكل غير صحيح فوق هذا المتغير بنوع غير منطقي.في هذه الحالة، يمكنك ببساطة الإشارة مباشرة إلىsetAppvars في الاختبار الخاص بك، بدلاً من استخدام هذا النطاق.

يمكنك أيضًا القيام بذلك:

<cfif NOT isSoapRequest()>...

وقم بلصق المنطق المتبقي داخل تلك القطعة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top