While also achievable with effects directly, using DelegatingHandler
s is easy and allows making use of the wider ecosystem.
open System
open System.Net.Http
//make sure your .NET version has sensible defaults for these:
let inner =
new SocketsHttpHandler(
PooledConnectionIdleTimeout = TimeSpan.FromMinutes(1),
PooledConnectionLifetime = TimeSpan.FromMinutes(1)
)
let clientFactory f handlers =
let client = new HttpClient(handlers inner, false)
f client
namespace System
namespace System.Net
namespace System.Net.Http
val inner: SocketsHttpHandler
Multiple items
type SocketsHttpHandler =
inherit HttpMessageHandler
new: unit -> unit
member ActivityHeadersPropagator: DistributedContextPropagator
member AllowAutoRedirect: bool
member AutomaticDecompression: DecompressionMethods
member ConnectCallback: Func<SocketsHttpConnectionContext,CancellationToken,ValueTask<Stream>>
member ConnectTimeout: TimeSpan
member CookieContainer: CookieContainer
member Credentials: ICredentials
member DefaultProxyCredentials: ICredentials
...
<summary>Provides the default message handler used by <see cref="T:System.Net.Http.HttpClient" /> in .NET Core 2.1 and later.</summary>
--------------------
SocketsHttpHandler() : SocketsHttpHandler
Multiple items
[<Struct>]
type TimeSpan =
new: hours: int * minutes: int * seconds: int -> unit + 4 overloads
member Add: ts: TimeSpan -> TimeSpan
member CompareTo: value: obj -> int + 1 overload
member Divide: divisor: float -> TimeSpan + 1 overload
member Duration: unit -> TimeSpan
member Equals: value: obj -> bool + 2 overloads
member GetHashCode: unit -> int
member Multiply: factor: float -> TimeSpan
member Negate: unit -> TimeSpan
member Subtract: ts: TimeSpan -> TimeSpan
...
<summary>Represents a time interval.</summary>
--------------------
TimeSpan ()
TimeSpan(ticks: int64) : TimeSpan
TimeSpan(hours: int, minutes: int, seconds: int) : TimeSpan
TimeSpan(days: int, hours: int, minutes: int, seconds: int) : TimeSpan
TimeSpan(days: int, hours: int, minutes: int, seconds: int, milliseconds: int) : TimeSpan
TimeSpan(days: int, hours: int, minutes: int, seconds: int, milliseconds: int, microseconds: int) : TimeSpan
TimeSpan.FromMinutes(value: float) : TimeSpan
val clientFactory: f: (HttpClient -> 'a) -> handlers: (SocketsHttpHandler -> #HttpMessageHandler) -> 'a
val f: (HttpClient -> 'a)
val handlers: (SocketsHttpHandler -> #HttpMessageHandler)
val client: HttpClient
Multiple items
type HttpClient =
inherit HttpMessageInvoker
new: unit -> unit + 2 overloads
member CancelPendingRequests: unit -> unit
member DeleteAsync: requestUri: string -> Task<HttpResponseMessage> + 3 overloads
member GetAsync: requestUri: string -> Task<HttpResponseMessage> + 7 overloads
member GetByteArrayAsync: requestUri: string -> Task<byte array> + 3 overloads
member GetStreamAsync: requestUri: string -> Task<Stream> + 3 overloads
member GetStringAsync: requestUri: string -> Task<string> + 3 overloads
member PatchAsync: requestUri: string * content: HttpContent -> Task<HttpResponseMessage> + 3 overloads
member PostAsync: requestUri: string * content: HttpContent -> Task<HttpResponseMessage> + 3 overloads
...
<summary>Provides a class for sending HTTP requests and receiving HTTP responses from a resource identified by a URI.</summary>
--------------------
HttpClient() : HttpClient
HttpClient(handler: HttpMessageHandler) : HttpClient
HttpClient(handler: HttpMessageHandler, disposeHandler: bool) : HttpClient