2016-10-08 13 views
5

Chcę zrozumieć, jak kontrolować, kiedy odpowiedzi są "buforowane", a kiedy są "ponownie obliczane".Suave - Kontrola, gdy odpowiedzi są "buforowane" lub ponownie obliczane.

Jako przykład:

[<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 

Jeśli uruchomić powyższą serwer WWW i uderzył go kilka razy, a następnie za każdym razem uzyskać ten sam znacznik czasu wstecz. Które wydaje mi się, że ma sens; appDemo to tylko wyrażenie, które jest obliczane po raz pierwszy i nigdy więcej, prawda?

W takich okolicznościach może być konieczne ponowne obliczenie wartości dla każdego żądania. Jak mogę to zrobić? Nie mogę znaleźć przykładu w dokumentach.

Odpowiedz

9

Spróbuj tego - nie wiem, jak wysoko to zdobywa on „idiomatyczne Suave” skali jednak:

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

Masz rację, że widzisz tę samą wartość, ponieważ jest to zrobione w czasie appDemo jest uwzględniany . Jest to właściwość jak działa F # i nie ma nic wspólnego z buforowaniem Suave'a.

Należy pamiętać, że typ WebPart jest aliasem dla funkcji HttpContext -> Async<HttpContext option> - więc z natury ulega przeliczeniu na każde żądanie, a nie jest obliczany jeden raz.

Powiązane problemy