You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Giraffe框架中makeRandomForecasts仅执行一次的原因排查

问题原因与解决方案

核心原因

问题出在函数执行时机错误:makeRandomForecasts 5 DateTime.Now是在Giraffe路由树初始化阶段就被调用执行了,而非每次收到请求时才触发。当webApp这个路由结构创建完成的那一刻,该函数仅运行一次,生成的随机结果被当作静态值缓存,后续所有请求都直接复用这个预先生成的结果,自然不会产生新的随机值。

看你代码的关键片段:

route "/forecasts" => noResponseCaching => htmlNodes (
    Views.forecasts (makeRandomForecasts 5 DateTime.Now))

这里htmlNodes接收的是已经计算完成的XmlNode结果,而非延迟执行的处理逻辑。路由初始化时就完成了所有计算,后续请求不会触发新的函数调用。

修复方案

需要将makeRandomForecasts的调用改为延迟执行,让它在每次请求到达时才运行。修改方式是把htmlNodes的参数换成一个接收HttpContext的函数(即使不需要用到上下文):

let webApp =
    choose [
        GET =>
            choose [
                // ... 其他路由
                route "/forecasts" => noResponseCaching => htmlNodes (fun _ ->
                    Views.forecasts (makeRandomForecasts 5 DateTime.Now))
            ]
        setStatusCode 404 => text "Not Found" ]

修改后,每次请求命中/forecasts路由时,才会执行fun _ -> ...内部的逻辑,调用makeRandomForecasts生成新的随机结果返回给客户端。

补充说明:noResponseCaching中间件的作用是禁止客户端缓存响应,它本身没有问题,但之前因服务器端提前计算结果,即使禁止客户端缓存,返回的仍是同一值。现在配合延迟执行逻辑,就能每次返回新的随机数据。

内容的提问来源于stack exchange,提问作者Jeffrey Rennie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 21:38:16