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
相关产品推荐
相关产品推荐

