Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Intercept C# HttpClient GetAsync

I have a web project (C#, MVC5 but no WebAPI) and a simple HTTP REST client that is calling an external REST service and acquires an accessToken etcing.

I want to check the response from all my Get/PostAsync calls for statusCode 401 but I see that I can only override the SendAsync method when implementing the DelegatingHandler.

class CustomDelegatingHandler : DelegatingHandler
{
    async protected override Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {
        HttpResponseMessage response = await base.SendAsync(request, cancellationToken);

        if (response.StatusCode == HttpStatusCode.Unauthorized)
        {

Is there something else I can do so as not to change the implementation of all my async calls to use SendAsync?

(What I really really want to do is refresh the accessToken.)

like image 390
maria Avatar asked Mar 17 '15 18:03

maria


2 Answers

I think you're on the right track. You wouldn't need to change your calls to use SendAsync instead of GetAsync, PostAsync, etc though. Rather, you'd need to change how you instantiate HttpClient:

var client = new HttpClient(new CustomDelegatingHandlerTokenRefresher());
// GetAsync, PostAsync, etc will hit your handler
like image 76
Todd Menier Avatar answered Oct 28 '22 07:10

Todd Menier


Use the Decorator or Interceptor pattern.

Example concrete decorator:

public class CustomDelegatingHandlerTokenRefresher() : DelegatingHandler
{
    public CustomDelegatingHandlerTokenRefresher(DelegatingHandler handler)
    {
        InnerHandler = handler;
    }

    protected override async Task<HttpResponseMessage> SendAsync(
      HttpRequestMessage request, CancellationToken cancellationToken)
    {
        RefreshToken();
        return await InnerHandler.SendAsync(request, cancellationToken);
    }
}
like image 26
Silas Reinagel Avatar answered Oct 28 '22 08:10

Silas Reinagel