ColdFusion 2023 FileRead 抛出 500 错误

sna*_*boy 5 coldfusion file-processing cfml

我们最近经历了从CF11升级到CF2023的过程。在我们的开发服务器上,一切似乎都按预期进行。然而,在我们的生产服务器上安装后,我们发现了一个奇怪的问题。

cfc 文件中的命令fileRead似乎读取该文件,但在 cfc 处理完成后会抛出 500 错误。任何其他 cfc 中的任何其他命令(我们尚未发现)都不会出现此问题。我可以在我们的生产服务器上重现这个问题;但在开发(或测试)中使用相同的测试页面,代码可以正常工作。

我们直接的解决方法是使用cffile action="read". 这在开发生产中似乎工作得很好。

在开发中工作但在生产中不起作用的示例测试代码(读取文件,根据代码转储内容,但随后 500 错误覆盖在文件转储上) - fileReadTest.cfc:

component {

    struct function getRules() {

        try {

        var _rules = fileRead('[path]/configuration.json');
            _rules = deserializeJSON(_rules);

        return _rules;

        } catch( any e) {
            cfdump( var = e);
        }
    }

    remote string function test() {
        try {

            var _r = getRules()
            cfdump(var = _r);

            return 'test'

         } catch( any e) {
            cfdump( var = e);
        }
    }

}

Run Code Online (Sandbox Code Playgroud)

这些测试通过 url 调用(出于测试目的),并以方法作为参数:

https://ourdoman.edu/fileReadTest.cfc?method=test

我确实可以访问 Coldfusion 管理员页面。我通过“设置摘要”页面将产品与开发进行了比较,一切似乎都一致。我无法访问 IIS,但我确信这些设置在各个服务器上都是匹配的。

需要注意的一件事是,无法从网络外部访问我们的开发服务器。换句话说,你必须在校园内才能使用 dev。

在查看 Coldfusion-error.log 时,我可以看到 SEVERE: Servlet.service() for servlet [CFCServlet] in context with path [] threw exception 似乎与生成 500 错误的时间一致。查找该错误似乎会导致 IIS 问题,但我没有看到任何明确的信息可以指示我们的网络管理员进行检查。

任何见解都会非常有帮助。虽然我们可以使用 cffile 作为解决方法,但我担心这是更大配置问题的迹象。

谢谢

编辑:

用于重现错误的代码的精简版本:

component {
    string function getRules() {
        var _rules = fileRead('c:/applications/test/test.txt');
        
        return _rules;
    }

    remote string function test() {
        var _r = getRules();
        return _r;                
    }
}
Run Code Online (Sandbox Code Playgroud)

test.txt = 这是一个测试。

结果:文件被读取,数据被cfdump,然后出现500错误 结果:文件被读取,数据被cfdump,然后出现500错误1

更新: 作为测试,我尝试使用 fileRead 读取 fileOpen 返回的 fileObject。例如:

 var x = fileOpen('[path]/test.txt')
 var y = fileRead(x, 16);
         fileClose(x);
Run Code Online (Sandbox Code Playgroud)

结果是一样的。文件被读取并输出(参见上面的示例代码),但随后显示 500 错误。如果我取出 fileRead,fileOpen 和 fileClose 似乎可以正常工作。

另外,有人建议我查看 application.cfc onRequestStart / onRequestEnd。我可以验证它们是否正常执行 - 作为测试,我让它们在每次开始和结束时发送一封电子邮件。此外,如果发生错误,application.cfc 中的 onError 也会发送电子邮件。

测试更新

在我的测试 cfc 中,我创建了一个循环来迭代调用 fileRead 的函数。每次迭代都会成功调用 fileRead,如 cfdump 的数据所示。一旦迭代完成,就会生成 500 错误。

回复

我认为查看控制台响应的样子可能会有所帮助。例如,如果文件是“这是一个测试”,则响应如下所示。首先是文件内容,然后将 500 错误附加到响应中。

<wddxPacket version='1.0'>
    <header/>
    <data>
        <string>
            this is a test<char code='0d'/>
            <char code='0a'/>
        </string>
    </data>
</wddxPacket>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>500</title>
        <style>
            body { 
    ... 
Run Code Online (Sandbox Code Playgroud)

线索?

一个重要的线索(?):如果从 .cfm 调用执行 fileRead 的 .cfc,使用cfhttp, createObject, invoke,则它不会出现错误。但是,如果通过[URL]/test.cfc?method=getData或(正如应用程序最初所做的那样)通过$http(AngularJS) 调用,则会生成错误。这两种方法都使用相同的 URL。如果从另一个调用它也会失败cfc

另一个花絮的 FileWrite行为方式与 相同FileRead。当从 .cfc 调用时,它会写入该文件,但随后抛出 500 错误。

堆栈跟踪

Jul 11, 2023 1:08:07 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [CFCServlet] in context with path [] threw exception
java.util.NoSuchElementException: No value present
    at java.base/java.util.Optional.get(Optional.java:143)
    at coldfusion.monitor.beans.RequestData.isGraphQlService(RequestData.java:795)
    at coldfusion.monitor.beans.RequestData.updateFunctionMetrics(RequestData.java:618)
    at coldfusion.monitor.beans.RequestData.updateTagData(RequestData.java:459)
    at coldfusion.monitor.beans.RequestData.updateData(RequestData.java:223)
    at coldfusion.monitor.event.RequestMonitorEventProcessor.onRequestEnd(RequestMonitorEventProcessor.java:419)
    at coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:82)
    at coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:47)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:492)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:373)
    at org.apache.coyote.ajp.AjpProcessor.service(AjpProcessor.java:459)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:926)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
    at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.base/java.lang.Thread.run(Thread.java:833)
Run Code Online (Sandbox Code Playgroud)

小智 0

您的方法签名表明它正在返回一个字符串。但是您没有返回字符串,这可能是问题所在吗?