Skip to the content.



In order to enable a flexible way to support cross cutting features, client libraries should support a pipeline of pluggable middleware. Users should be able to remove existing middleware, replace it and add new piece of middleware at any location in the pipeline.


Performance Considerations

Due to the fact that every request and response pass through each and every piece of middleware it is important that processing is efficient. Middleware pipelines can be used on both application servers as well as clients so they need to be able to support a high volume of request and be thread safe.

Middleware should be cautious about preserving state between the processing of the request and the handling of the response as this can put significant memory pressure on high load servers.

Security Considerations

Example Usages

Here’s a straw man proposal for how Middleware control objects could be used to influence the behavior of the request.

    var client = new HttpClientFactory().CreateClient(new DelegatingHandler[] {
                                                        new AuthHandler(new AuthOptions()),
                                                        new RetryHandler(new RetryOptions()),
                                                        new RedirectHandler(new RedirectOptions())

    var request = new HttpRequestMessage()
        RequestUri = new Uri(""),
        Method = HttpMethod.Get

    request.AddMiddlewareControl(new IMiddlewareControl[] {
        new RetryOptions()
            ShouldRetry = (req) => { return false; }
        new RedirectOptions()
            MaxRedirects = 0
        new AuthOptions()
            SelectedUser = "bob"

    var response = client.SendAsync(request);

Open Issues