问题:为WSDL请求CFC时,出现以下错误:变量形式未定义。它发生在这行代码中,位于application.cfc
中的OnRequestStart方法中<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>
答案 0 :(得分:8)
也许尝试添加:
<cfif IsDefined("form")>...</cfif>
围绕上面的代码?
答案 1 :(得分:4)
你也可以cfparam
你正在寻找的变量然后只需稍微改变你的逻辑(假设resetAppVars是一个布尔值:
<cfparam name="form.resetAppVars" default="false" />
...
<cfif form.resetAppVars>
<cfset OnApplicationStart() />
</cfif>
编辑:我不确定上面的代码是否可以被视为黑客,但对我来说它似乎是非常标准的CF.
答案 2 :(得分:3)
此post of Ben Nadel提供了可用于不同类型请求的范围的详细列表。
通过阅读它,您可以很容易地发现表单范围在给定的上下文中不可用,但 url 是。
答案 3 :(得分:2)
我听说这只是一个意见问题,但在我看来,在CFC中引用您的表单范围是不恰当的,因为无法保证在调用cfc时表单范围可用并且当你的方法被调用时。最好确保明确向对象提供方法可用的任何数据。这可以通过包含一个参数来完成:
<cfargument name="resetAppVars" type="boolean" required="false" default="false" />
然后检查arguments.resetAppVars,它总是被定义,但是默认为false。
或者通过在对象上创建属性并创建显式set方法:
(在您的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 />
作为声明在本地对此进行范围调整,这使其成为对象的私有属性,并且可能是正确的,因此调用该对象的代码不能使用非布尔类型不正确地覆盖此变量。在这种情况下,您只需在测试中直接引用resetAppvars,而不是使用此范围。
答案 4 :(得分:1)
你也可以这样做:
<cfif NOT isSoapRequest()>...
并将剩下的逻辑放在那个块中。