Учтивый - контроль, когда ответы «кэшируются» или пересчитываются

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

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

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


person Stewart_R    schedule 08.10.2016    source источник


Ответы (1)


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

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

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

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

person scrwtp    schedule 08.10.2016