Suave - 控制何时响应 'cached' 或重新计算

Suave - Control when responses are 'cached' or recalculated

我想了解如何控制响应何时 'cached' 与何时响应 'recalculated'。

举个例子:

[<EntryPoint>]
let main [| port |] =

    let config =
        { defaultConfig with
                bindings = [ HttpBinding.mk HTTP IPAddress.Loopback (uint16 port) ]
                listenTimeout = TimeSpan.FromMilliseconds 3000.
                }

    let appDemo:WebPart = 
        DateTime.Now.ToString()
        |> sprintf "Server timestamp: %s"
        |> Successful.OK

    startWebServer config appDemo

如果我 运行 上面的网络服务器并多次点击它,那么每次我都会得到相同的时间戳。我想这是有道理的; appDemo 只是一个表达式,第一次计算就不会再计算了,对吧?

在这种情况下,我可能希望每个请求的 appDemo 都为 'recalculated'。我怎么做?我似乎无法在文档中找到示例。

试试这个 - 虽然不确定它在 "idiomatic Suave" 规模上的得分有多高:

let appDemo:WebPart = 
    request (fun req -> 
        DateTime.Now.ToString()
        |> sprintf "Server timestamp: %s"
        |> Successful.OK)

你是对的,因为你看到了相同的值,因为它是在评估 appDemo 时捕获的。然而,这是 F# 工作原理的 属性,与 Suave 缓存它无关。

请注意,WebPart 类型是 HttpContext -> Async<HttpContext option> 函数的别名 - 因此它本质上让自己在每次请求时重新计算,而不是计算一次。