【问题标题】:ColdFusion = OnRequest ErrorColdFusion = OnRequest 错误
【发布时间】:2024-04-22 16:25:02
【问题描述】:

查看日志,我们得到了数百个以下内容

"Error","jrpp-185","08/21/12","10:05:43","PATH","www.domain.com 
Agent:Mozilla/4.0 (compatible; Synapse) 
Error: An exception occurred when invoking a event handler method from Application.cfc. 
The method name is: onRequest.

它们似乎是大部分搜索机器人。我可以看到对函数的引用在 APplication.cfc 上的位置如下

<cffunction name="onRequest" returnType="void">
        <cfargument name="targetPage" type="String" required=true/>
        <cfsetting enablecfoutputonly="yes" requesttimeout="20">

        <cfparam name="url.refresh" default="0">
        <cfset request.strMember = Duplicate(session.strMember)/>

        <cfset request.tNow = GetTickCount()>
        <cfif url.refresh EQ 0>
            <cfset request.iCacheHr = 12/>
        <cfelse>
            <cfset request.iCacheHr = 0/>
        </cfif>

        <cflogin>
            <cfif IsDefined("session.strMember.sRoles")>
                <cfloginuser name="#session.strMember.sFirstName##session.strMember.sLastName#"
                    password="12345"
                    roles="#session.strMember.sRoles#"/>
            </cfif>
        </cflogin>

        <cfinclude template="core/incl/SessionLogger.cfm">
        <cfinclude template="core/incl/LinkTranslator.cfm">
        <cfinclude template="core/incl/udf.cfm">

        <cfinclude template="urlcheck.cfm"/>
        <cfinclude template="#Arguments.targetPage#">
    </cffunction>

因此,任何人都可以就问题所在以及如何解决问题提出建议吗?我对 CF 还很陌生,这让我把剩下的头发都拔掉了

【问题讨论】:

  • Element XMLHOMEPAGE is undefined in a CFML structure referenced as part of an expression.
  • 还有Element STRMEMBER is undefined in SESSION
  • 第二个 - Element STRMEMBER is undefined in SESSION - 很可能导致您的“错误:从...调用事件处理程序方法时发生异常”可能最好的方法是将其设置为空字符串默认情况下。
  • &lt;cffunction name="onSessionStart"&gt; &lt;cfscript&gt; session.strMember = StructNew(); session.strMember.iMemberId = 0; session.strMember.lSecurityLevels = "Guest"; &lt;/cfscript&gt;... 这是它的设置位置/方式
  • 好的,似乎错误指向Element XMLZONE is undefined in REQUEST.,代码为&lt;cfscript&gt; variables.aZoneInfo = XmlSearch(application.xmlZones, "//zone[position() = 1]"); try { request.xmlZone = ToString(variables.aZoneInfo[1]); } catch(any expt){ variables.objZoneDAO = CreateObject("component", "#application.sComponentDir#ZoneDAO").init(application.sDSN); variables.objZoneDAO.Read(variables.objZone, 1); } &lt;/cfscript&gt;。这只会发生在偶尔的机器人身上。 XML 文件在那里并且适用于所有用户。有什么想法吗?

标签: coldfusion coldfusion-8 application.cfc


【解决方案1】:

1) 你使用两种不同的编码风格

    <cfparam name="url.refresh" default="0">
    <cfset request.strMember = Duplicate(session.strMember)/>

第一行中的无效/左打开 XML 标记和第二行中的有效(关闭)XML 标记。 尝试坚持一个(最好是最后一个)。

2) 您正在使用旧方法来检查正在定义的变量

IsDefined("session.strMember.sRoles")

了解更新(更好更快)

StructKeyExists(session.strMember, "sRoles")

3) 很可能您的代码正在调用

<cfloginuser ... >

在每个页面请求时

4) 确保所有包含的路径都是正确的,并且它们本身没有任何错误。

简化您的方法,直到您不再收到错误,然后调查究竟是什么原因造成的

【讨论】:

  • 我从一家公司接手了这个项目,该公司开始但没有完成,然后是两个后续的非 CF 开发人员(比如我自己)修改了它:-( 我会尝试你的建议。谢谢!
  • 好的,解决了一些问题,主要的(少数)是Element STRMEMBER is undefined in SESSION,主要用于搜索机器人。我认为有问题的代码是 request.strMember = Duplicate(session.strMember)
  • 可能最好的方法是默认将其设置为空字符串
【解决方案2】:

机器人是否在访问不存在的页面?

也许尝试将最后一行更改为:

<cfif fileExists(expandPath(Arguments.targetPage))>
    <cfinclude template="#Arguments.targetPage#">
<cfelse>
    <cfabort>
</cfif>

【讨论】:

  • 他们存在"Error","jrpp-684","08/22/12","20:53:50","08_VIRTUALFESTIVALS","www.virtualfestivals.com/index.cfm?CFTOKEN=14333196&amp;CFID=117847977 Agent:Mozilla/5.0 (compatible; Yahoo! Slurp/3.0; http://help.yahoo.com/help/us/ysearch/slurp) Error: An exception occurred when invoking a event handler method from Application.cfc. The method name is: onRequest."
  • 如果我们能看到实际的错误,这将非常有帮助,也许是该函数中的 try/catch 将详细信息通过电子邮件发送给您,或记录它们..
  • 错误如上所示 - 我们在日志文件中捕获它。即使使用 FF 的用户代理开关插件,我们也无法将其复制为用户。发布 application.cfc 的内容会有帮助吗?
  • 尝试类似:.. ..请原谅评论中的混乱,希望你能理解
  • 好的,似乎错误指向Element XMLZONE is undefined in REQUEST.,代码为&lt;cfscript&gt; variables.aZoneInfo = XmlSearch(application.xmlZones, "//zone[position() = 1]"); try { request.xmlZone = ToString(variables.aZoneInfo[1]); } catch(any expt){ variables.objZoneDAO = CreateObject("component", "#application.sComponentDir#ZoneDAO").init(application.sDSN); variables.objZoneDAO.Read(variables.objZone, 1); } &lt;/cfscript&gt;。这只会发生在偶尔的机器人身上。 XML 文件在那里并且适用于所有用户。有什么想法吗?
【解决方案3】:

也许您可以检测它们是否是机器人并为它们提供其他服务?取决于您希望网站的搜索友好程度:

http://www.bennadel.com/blog/1083-ColdFusion-Session-Management-And-Spiders-Bots.htm

【讨论】: