5

我想了解如何控制响应何时“缓存”以及何时“重新计算”。

举个例子:

[<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为每个请求“重新计算”。我怎么做?我似乎在文档中找不到示例。

4

1 回答 1

9

试试这个——虽然不确定它在“惯用的 Suave”量表上的得分有多高:

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

您是对的,您看到的是相同的值,因为它是在评估 appDemo 时捕获的。然而,这是 F# 工作方式的一个属性,与 Suave 缓存它无关。

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

于 2016-10-08T10:31:14.130 回答