mirror of
https://github.com/nsnail/Ocelot.git
synced 2025-04-23 02:52:50 +08:00

* #296 renamed configuration.json to ocelot.json in preparation * removed things we dont need for tests * another file we dont need * removed some async we dont need * refactoring to consolidate configuration code * removed another pointless abstraction * #296 started writing merge code * #296 coming up with ideas for this config merging * #296 still hacking this idea around * #296 will now do a crappy merge on the configuration * #296 change so tests pass on windows
80 lines
3.2 KiB
ReStructuredText
80 lines
3.2 KiB
ReStructuredText
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!
|