Suave - Контроль, когда ответы "кэшируются" или пересчитываются

Я хочу понять, как контролировать, когда ответы "кэшируются" по сравнению с тем, когда они "пересчитываются".

В качестве примера:

[<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 быть "пересчитанным" для каждого запроса. Как я могу это сделать? Я не могу найти пример в документации.

1 ответ

Решение

Попробуйте это - не уверен, насколько высоко он набрал по шкале "идиоматического учтивости":

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

Вы правы в том, что видите одно и то же значение, потому что оно фиксируется во время оценки appDemo. Однако это свойство того, как работает F#, и не имеет ничего общего с Suave, кеширующим его.

Обратите внимание, что WebPart тип является псевдонимом для HttpContext -> Async<HttpContext option> функция - так что по своей сути она поддается пересчету на каждый запрос, а не рассчитывается один раз.

Другие вопросы по тегам