mirror of
				https://github.com/nsnail/Ocelot.git
				synced 2025-11-04 15:30:49 +08:00 
			
		
		
		
	This commit is contained in:
		@@ -1,79 +1,66 @@
 | 
			
		||||
Delegating Handers
 | 
			
		||||
==================
 | 
			
		||||
 | 
			
		||||
Ocelot allows the user to add delegating handlers to the HttpClient transport. This feature was requested `GitHub #208 <https://github.com/TomPallister/Ocelot/issues/208>`_ 
 | 
			
		||||
and I decided that it was going to be useful in various ways. Since then we extended it in `GitHub #264 <https://github.com/TomPallister/Ocelot/issues/264>`_.
 | 
			
		||||
 | 
			
		||||
Usage
 | 
			
		||||
^^^^^
 | 
			
		||||
 | 
			
		||||
In order to add delegating handlers to the HttpClient transport you need to do two main things.
 | 
			
		||||
 | 
			
		||||
First in order to create a class that can be used a delegating handler it must look as follows. We are going to register these handlers in the 
 | 
			
		||||
asp.net core container so you can inject any other services you have registered into the constructor of your handler.
 | 
			
		||||
 | 
			
		||||
.. code-block:: csharp
 | 
			
		||||
 | 
			
		||||
    public class FakeHandler : DelegatingHandler
 | 
			
		||||
    {
 | 
			
		||||
        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
 | 
			
		||||
        {
 | 
			
		||||
            //do stuff and optionally call the base handler..
 | 
			
		||||
            return await base.SendAsync(request, cancellationToken);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
Next you must add the handlers to Ocelot's container either as singleton like follows..
 | 
			
		||||
 | 
			
		||||
.. code-block:: csharp
 | 
			
		||||
 | 
			
		||||
    services.AddOcelot()
 | 
			
		||||
            .AddSingletonDelegatingHandler<FakeHandler>()
 | 
			
		||||
            .AddSingletonDelegatingHandler<FakeHandlerTwo>()
 | 
			
		||||
 | 
			
		||||
Or transient as below...
 | 
			
		||||
 | 
			
		||||
.. code-block:: csharp
 | 
			
		||||
 | 
			
		||||
    services.AddOcelot()
 | 
			
		||||
            .AddTransientDelegatingHandler<FakeHandler>()
 | 
			
		||||
            .AddTransientDelegatingHandler<FakeHandlerTwo>()
 | 
			
		||||
 | 
			
		||||
Both of these Add methods have a default parameter called global which is set to false. If it is false then the intent of 
 | 
			
		||||
the DelegatingHandler is to be applied to specific ReRoutes via ocelot.json (more on that later). If it is set to true
 | 
			
		||||
then it becomes a global handler and will be applied to all ReRoutes.
 | 
			
		||||
 | 
			
		||||
e.g.
 | 
			
		||||
 | 
			
		||||
.. code-block:: csharp
 | 
			
		||||
 | 
			
		||||
    services.AddOcelot()
 | 
			
		||||
            .AddSingletonDelegatingHandler<FakeHandler>(true)
 | 
			
		||||
 | 
			
		||||
Or transient as below...
 | 
			
		||||
 | 
			
		||||
.. code-block:: csharp
 | 
			
		||||
 | 
			
		||||
    services.AddOcelot()
 | 
			
		||||
            .AddTransientDelegatingHandler<FakeHandler>(true)
 | 
			
		||||
 | 
			
		||||
Finally if you want ReRoute specific DelegatingHandlers or to order your specific and / or global (more on this later) DelegatingHandlers
 | 
			
		||||
then you must add the following json to the specific ReRoute in ocelot.json. The names in the array must match the class names of your
 | 
			
		||||
DelegatingHandlers for Ocelot to match them together.
 | 
			
		||||
 | 
			
		||||
.. code-block:: json
 | 
			
		||||
 | 
			
		||||
    "DelegatingHandlers": [
 | 
			
		||||
        "FakeHandlerTwo",
 | 
			
		||||
        "FakeHandler"
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
You can have as many DelegatingHandlers as you want and they are run in the following order:
 | 
			
		||||
 | 
			
		||||
1. Any globals that are left in the order they were added to services and are not in the DelegatingHandlers array from ocelot.json.
 | 
			
		||||
2. Any non global DelegatingHandlers plus any globals that were in the DelegatingHandlers array from ocelot.json ordered as they are in the DelegatingHandlers array.
 | 
			
		||||
3. Tracing DelegatingHandler if enabled (see tracing docs).
 | 
			
		||||
4. QoS DelegatingHandler if enabled (see QoS docs).
 | 
			
		||||
5. The HttpClient sends the HttpRequestMessage.
 | 
			
		||||
 | 
			
		||||
Hopefully other people will find this feature useful!
 | 
			
		||||
Delegating Handlers
 | 
			
		||||
===================
 | 
			
		||||
 | 
			
		||||
Ocelot allows the user to add delegating handlers to the HttpClient transport. This feature was requested `GitHub #208 <https://github.com/TomPallister/Ocelot/issues/208>`_ 
 | 
			
		||||
and I decided that it was going to be useful in various ways. Since then we extended it in `GitHub #264 <https://github.com/TomPallister/Ocelot/issues/264>`_.
 | 
			
		||||
 | 
			
		||||
Usage
 | 
			
		||||
^^^^^
 | 
			
		||||
 | 
			
		||||
In order to add delegating handlers to the HttpClient transport you need to do two main things.
 | 
			
		||||
 | 
			
		||||
First in order to create a class that can be used a delegating handler it must look as follows. We are going to register these handlers in the 
 | 
			
		||||
asp.net core container so you can inject any other services you have registered into the constructor of your handler.
 | 
			
		||||
 | 
			
		||||
.. code-block:: csharp
 | 
			
		||||
 | 
			
		||||
    public class FakeHandler : DelegatingHandler
 | 
			
		||||
    {
 | 
			
		||||
        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
 | 
			
		||||
        {
 | 
			
		||||
            //do stuff and optionally call the base handler..
 | 
			
		||||
            return await base.SendAsync(request, cancellationToken);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
Next you must add the handlers to Ocelot's container like below...
 | 
			
		||||
 | 
			
		||||
.. code-block:: csharp
 | 
			
		||||
 | 
			
		||||
    services.AddOcelot()
 | 
			
		||||
            .AddDelegatingHandler<FakeHandler>()
 | 
			
		||||
            .AddDelegatingHandler<FakeHandlerTwo>()
 | 
			
		||||
 | 
			
		||||
Both of these Add methods have a default parameter called global which is set to false. If it is false then the intent of 
 | 
			
		||||
the DelegatingHandler is to be applied to specific ReRoutes via ocelot.json (more on that later). If it is set to true
 | 
			
		||||
then it becomes a global handler and will be applied to all ReRoutes.
 | 
			
		||||
 | 
			
		||||
e.g.
 | 
			
		||||
 | 
			
		||||
As below...
 | 
			
		||||
 | 
			
		||||
.. code-block:: csharp
 | 
			
		||||
 | 
			
		||||
    services.AddOcelot()
 | 
			
		||||
            .AddDelegatingHandler<FakeHandler>(true)
 | 
			
		||||
 | 
			
		||||
Finally if you want ReRoute specific DelegatingHandlers or to order your specific and / or global (more on this later) DelegatingHandlers
 | 
			
		||||
then you must add the following json to the specific ReRoute in ocelot.json. The names in the array must match the class names of your
 | 
			
		||||
DelegatingHandlers for Ocelot to match them together.
 | 
			
		||||
 | 
			
		||||
.. code-block:: json
 | 
			
		||||
 | 
			
		||||
    "DelegatingHandlers": [
 | 
			
		||||
        "FakeHandlerTwo",
 | 
			
		||||
        "FakeHandler"
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
You can have as many DelegatingHandlers as you want and they are run in the following order:
 | 
			
		||||
 | 
			
		||||
1. Any globals that are left in the order they were added to services and are not in the DelegatingHandlers array from ocelot.json.
 | 
			
		||||
2. Any non global DelegatingHandlers plus any globals that were in the DelegatingHandlers array from ocelot.json ordered as they are in the DelegatingHandlers array.
 | 
			
		||||
3. Tracing DelegatingHandler if enabled (see tracing docs).
 | 
			
		||||
4. QoS DelegatingHandler if enabled (see QoS docs).
 | 
			
		||||
5. The HttpClient sends the HttpRequestMessage.
 | 
			
		||||
 | 
			
		||||
Hopefully other people will find this feature useful!
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user