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>
函数的别名 - 因此它本质上让自己在每次请求时重新计算,而不是计算一次。
我想了解如何控制响应何时 '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>
函数的别名 - 因此它本质上让自己在每次请求时重新计算,而不是计算一次。